WinForm—串口通讯

ialPort(串行端口资源)

常用属性:

BaudRate  此串行端口上要使用的波特率

DataBits  每发送/接收一个字节的数据位数目

DtrEnable  在通讯过程中是否启用数据终端就绪(Str)行

PortName  要打开的通讯端口的名称

RtsEnable  在通讯过程中是否启用请求发送(Rts)行

StopBits  每发送/接收一个字节的停止位数

 常用事件:

DataReceived  每次从SerialPort接收数据时引发

应用:

0、查询串口 并加载

1、打开串口

2、发送数据

3、接收数据

 1 //SerialPort数据读取
 2         private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
 3         {
 4             //此项目接收数据每12位为一组,并以“02”为开始标识符,第2到第7位的最后一个数字为传输的数据
 5 
 6             //延迟100ms执行,为了防止SerialPort获取数据时,获取到的数据少于12位,显示框不显示数据问题
 7             Thread.Sleep(100);
 8             //当接收到的数据>=12位,即一个完整的数据时,再进行数据读取分析
 9             if (serialPort1.BytesToRead >= 12)
10             {
11                 try
12                 {
13                     //将缓存区的数据放入by数组中
14                     byte[] by = new byte[serialPort1.BytesToRead];
15                     while (serialPort1.BytesToRead > 0)
16                     {
17                         //★★★端口控件读取数据★★★
18                         serialPort1.Read(by, 0, by.Length);
19                     }
20                     //result为最终显示结果
21                     string result = "";
22                     //循环判断by数组,找到开始标识符“02”
23                     for (int j = 0; j < by.Length; j++)
24                     {
25                         //将当前数据转换为16进制字符串后,不足2位的向左用“0”补齐
26                         string currentby = Convert.ToString(by[j], 16).PadLeft(2, '0');
27                         //如果当前为数据开始标识符,则读取分析数据
28                         if (currentby == "02")
29                         {
30                             //当剩余数据包换一个完整的12位数据时进行读取分析
31                             if (by.Length - j > 11)
32                             {
33                                 //第2位开始到第7位结束,共6位为传输的数据
34                                 for (int k = j + 2; k <= j + 7; k++)
35                                 {
36                                     currentby = Convert.ToString(by[k], 16).PadLeft(2, '0');
37                                     result += currentby.Substring(1, 1);
38                                     //前三位为整数部分,后三位为小数部分
39                                     if (k == j + 4)
40                                     {
41                                         result += ".";
42                                     }
43                                 }
44                             }
45                             //展示数据
46                             txt_Weight.Text = (Convert.ToDecimal(result)).ToString();
47                             break;
48                         }
49                     }
50                 }
51                 catch (Exception ex)
52                 {
53                     MessageBox.Show(ex.ToString());
54                 }
55             }
56         }
SerialPort控件数据读取

4、数据接收错误

错误:将返回的数据处理后倒入指定的文本框,因线程问题出现错误

 

解决方案:Form.CheckForIllegalCrossThreadCalls = false;

原文地址:https://www.cnblogs.com/qq450867541/p/7092653.html