C#-WinForm串口通信Demo 附源工程文件可直接通过编译。
Demo功能介绍

下载地址百度网盘
链接:https://pan.baidu.com/s/1AdhP8uUkSvVg3qXUtlMvOw?pwd=ieo5
提取码:ieo5
源代码
介绍:
cbx_Port为lable文字"串口号"后对应控件命名
cbx_BaudRate为lable文字"波特率"后对应控件命名
cbx_DataBits为lable文字"数据位"后对应控件命名
cbx_StopBits为lable文字"停止位"后对应控件命名
cbx_Parity为labl文字"校验位"后对应控件命名
btn_StartComm为"打开串口(关闭串口)"按钮命名
Senddatademo为"指令1"按钮命名
textBox1为打印区域控件命名
using System; using System.IO.Ports; using System.Threading; using System.Windows.Forms; namespace WinformDemo_RS485_ { public partial class Form1 : Form { private SerialPort serialPort1 = new SerialPort(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string[] ports = SerialPort.GetPortNames();//获取电脑上可用串口号 cbx_Port.Items.AddRange(ports); cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//如果里面有数据,显示第0个 cbx_BaudRate.SelectedIndex = 3; cbx_DataBits.SelectedIndex = 2; cbx_StopBits.SelectedIndex = 1; cbx_Parity.SelectedIndex = 0; } private void btn_StartComm_Click(object sender, EventArgs e) { if (btn_StartComm.Text == "打开串口") { try { //获取cbx_Port要打开的串口号 serialPort1.PortName = cbx_Port.Text; //获取 cbx_BaudRate选择的波特率 serialPort1.BaudRate = int.Parse(cbx_BaudRate.Text); //设置数据位 serialPort1.DataBits = int.Parse(cbx_DataBits.Text); ///设置停止位 if (cbx_StopBits.SelectedIndex == 1) { serialPort1.StopBits = StopBits.One; } else if (cbx_StopBits.SelectedIndex == 3) { serialPort1.StopBits = StopBits.OnePointFive; } else if (cbx_StopBits.SelectedIndex == 2) { serialPort1.StopBits = StopBits.Two; } else if (cbx_StopBits.SelectedIndex == 0) { serialPort1.StopBits = StopBits.None; } ///设置奇偶校验 if (cbx_Parity.SelectedIndex == 0) { serialPort1.Parity = Parity.None; } else if (cbx_Parity.SelectedIndex == 1) { serialPort1.Parity = Parity.Odd; } else if (cbx_Parity.SelectedIndex == 2) { serialPort1.Parity = Parity.Even; } else if (cbx_Parity.SelectedIndex == 3) { serialPort1.Parity = Parity.Mark; } else if (cbx_Parity.SelectedIndex == 4) { serialPort1.Parity = Parity.Space; } serialPort1.Open(); btn_StartComm.Text = "关闭串口"; } catch (Exception err) { MessageBox.Show("打开失败" + err.ToString(), "提示!"); } } else { try { serialPort1.Close(); } catch (Exception) { } btn_StartComm.Text = "打开串口"; } } protected override void WndProc(ref Message m) { if (m.Msg == 0x0219) {//设备改变 if (m.WParam.ToInt32() == 0x8004) {//usb串口拔出 string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口 cbx_Port.Items.Clear();//清除comboBox里面的数据 cbx_Port.Items.AddRange(ports);//给cbx_Port添加数据 if (Senddatademo.Text == "关闭串口") {//用户打开过串口 if (!serialPort1.IsOpen) {//用户打开的串口被关闭:说明热插拔是用户打开的串口 Senddatademo.Text = "打开串口"; serialPort1.Dispose();//释放掉原先的串口资源 cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号 } else { cbx_Port.Text = btn_StartComm.Text;//显示用户打开的那个串口号 } } else {//用户没有打开过串口 cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号 } } else if (m.WParam.ToInt32() == 0x8000) {//usb串口连接上 string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口 cbx_Port.Items.Clear(); cbx_Port.Items.AddRange(ports); if (Senddatademo.Text == "关闭串口") {//用户打开过一个串口 cbx_Port.Text = btn_StartComm.Text;//显示用户打开的那个串口号 } else { cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号 } } } base.WndProc(ref m); } /// <summary> /// 接收数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { int len = serialPort1.BytesToRead;//获取可以读取的字节数 byte[] buff = new byte[len];//创建缓存数据数组 serialPort1.Read(buff, 0, len);//把数据读取到buff数组 Invoke((new Action(() => { ///文本框打印指令 textBox1.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 收◇{ByteToString(buff)}\r\n"); }))); } /// <summary> /// 点击指令1按钮后发送指令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Senddatademo_Click(object sender, EventArgs e) { byte[] data = { 0x01, 0x02, 0x03, 0x04 }; try { if (data.Length > 0) { serialPort1.Write(data, 0, data.Length);//串口发送数据 ///文本框打印指令 textBox1.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 发◇{ByteToString(data)}\r\n"); Thread.Sleep(1000); serialPort1_DataReceived(sender, null); } } catch (Exception) { } } /// <summary> /// 字节转字符 便于打印到文本框 /// </summary> /// <param name="data"></param> /// <returns></returns> private string ByteToString(byte[] data) { string str = ""; if (data != null) { for (int i = 0; i < data.Length; i++) { str += data[i].ToString("X2") + " "; } } return str; } } }

浙公网安备 33010602011771号