winform开发串口通信桌面程序
时间: 2023-07-26 11:04:41 浏览: 51
下面是一个使用C#和WinForms开发串口通信桌面程序的示例代码:
```csharp
using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace SerialPortDemo
{
public partial class MainForm : Form
{
private SerialPort serialPort;
public MainForm()
{
InitializeComponent();
// 初始化串口
serialPort = new SerialPort();
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.ReadTimeout = 1000;
serialPort.WriteTimeout = 1000;
// 遍历可用串口
foreach (string portName in SerialPort.GetPortNames())
{
comboBoxPortName.Items.Add(portName);
}
if (comboBoxPortName.Items.Count > 0)
{
comboBoxPortName.SelectedIndex = 0;
}
// 注册事件处理函数
serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
}
private void buttonOpen_Click(object sender, EventArgs e)
{
if (!serialPort.IsOpen)
{
try
{
serialPort.PortName = comboBoxPortName.Text;
serialPort.Open();
buttonOpen.Text = "关闭串口";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
serialPort.Close();
buttonOpen.Text = "打开串口";
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (e.EventType == SerialData.Chars)
{
try
{
int count = serialPort.BytesToRead;
byte[] buffer = new byte[count];
serialPort.Read(buffer, 0, count);
string text = System.Text.Encoding.Default.GetString(buffer);
textBoxReceived.Invoke(new Action(() => textBoxReceived.AppendText(text)));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
string text = textBoxSend.Text;
byte[] buffer = System.Text.Encoding.Default.GetBytes(text);
try
{
serialPort.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("请先打开串口", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
```
在上述代码中,我们使用SerialPort类进行串口通信。在窗体的构造函数中,我们初始化串口参数,并遍历可用串口名称,将其添加到下拉列表中。在打开串口按钮的事件处理函数中,我们根据用户选择的串口名称打开串口,并在按钮上显示“关闭串口”;如果串口已经打开,则关闭串口,并在按钮上显示“打开串口”。在串口数据接收事件处理函数中,我们读取串口缓冲区中的数据,并在接收文本框中显示。在发送按钮的事件处理函数中,我们将发送文本框中的数据转换为字节数组,并发送给串口。
需要注意的是,上述代码仅供参考,实际应用需要根据具体情况进行修改。例如,需要在打开串口之前检查用户选择的串口是否可用,以及在窗体关闭之前关闭串口。同时,还需要处理串口通信中的异常情况,如超时、数据格式错误等。