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 }
4、数据接收错误
错误:将返回的数据处理后倒入指定的文本框,因线程问题出现错误
解决方案:Form.CheckForIllegalCrossThreadCalls = false;