写一个串口调试助手,要求能发送能接收,用C# winform
时间: 2023-07-08 12:23:46 浏览: 118
好的,下面是一个基于C# Winform的串口调试助手示例,可以实现发送和接收串口数据。
首先,在Winform界面上添加以下控件:
- 一个ComboBox控件用于选择串口号和波特率;
- 一个TextBox控件用于显示接收到的串口数据;
- 一个TextBox控件用于输入需要发送的串口数据;
- 一个Button控件用于发送串口数据;
- 一个Button控件用于打开/关闭串口连接。
然后,在代码中添加以下逻辑:
1. 初始化串口
在窗口的Load事件中,初始化串口并将可用的串口号和波特率添加到ComboBox控件中:
```
private void Form1_Load(object sender, EventArgs e)
{
// 初始化串口
serialPort1 = new SerialPort();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
// 添加可用的串口号
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
comboBox1.Items.Add(port);
}
// 添加可用的波特率
comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");
comboBox2.SelectedIndex = 0;
}
```
2. 打开/关闭串口连接
在Button控件的Click事件中,根据当前按钮文本判断是否需要打开或关闭串口连接:
```
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "打开串口")
{
// 打开串口连接
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = int.Parse(comboBox2.Text);
serialPort1.Open();
button1.Text = "关闭串口";
}
else
{
// 关闭串口连接
serialPort1.Close();
button1.Text = "打开串口";
}
}
```
3. 发送串口数据
在发送按钮的Click事件中,将需要发送的串口数据写入串口缓冲区:
```
private void button2_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
// 发送串口数据
serialPort1.Write(textBox2.Text);
}
}
```
4. 接收串口数据
在串口接收到数据时,将数据添加到接收TextBox控件中:
```
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort1.ReadExisting();
this.Invoke((MethodInvoker)delegate
{
textBox1.AppendText(data);
});
}
```
在这里,我们使用Invoke方法将数据添加到接收TextBox控件中,以避免跨线程访问错误。
完整代码如下:
```
using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace SerialPortAssistant
{
public partial class Form1 : Form
{
private SerialPort serialPort1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 初始化串口
serialPort1 = new SerialPort();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
// 添加可用的串口号
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
comboBox1.Items.Add(port);
}
// 添加可用的波特率
comboBox2.Items.Add("9600");
comboBox2.Items.Add("115200");
comboBox2.SelectedIndex = 0;
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "打开串口")
{
// 打开串口连接
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = int.Parse(comboBox2.Text);
serialPort1.Open();
button1.Text = "关闭串口";
}
else
{
// 关闭串口连接
serialPort1.Close();
button1.Text = "打开串口";
}
}
private void button2_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
// 发送串口数据
serialPort1.Write(textBox2.Text);
}
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPort1.ReadExisting();
this.Invoke((MethodInvoker)delegate
{
textBox1.AppendText(data);
});
}
}
}
```
希望这个示例对您有所帮助!
阅读全文