赞
踩
C# 中串口SerialPort类不能接收多字节,在SerialPort已经设置了ReceiveByteThreshold 触发read的字节数
之前的串口接收事件如下:
- private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //串口接受数据事件
- {
- int buffersize = serialPort1.BytesToRead;
- byte[] data = new byte[buffersize];
- serialPort1.Read(data, 0, buffersize);
- textBox_Show.AppendText(buffersize.ToString()+ "\r\n");
- //label_Wait.Text = "缓冲" + buffersize.ToString();
-
- }
可以看到在上位机显示读取的字节数有30和3,除了30个字节之外,3个字节也触发了串口接收事件
接收事件触发之后线程挂起100ms,这样每次基本上接收到100个字节左右(波特率9600Bps)
最好别把数据处理的部分放在这个接收事件里面,这里使用到了异步委托:
串口接收事件:
- private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //串口接受数据事件
- {
- if (serialPort1.IsOpen)
- {
- int buffersize = serialPort1.BytesToRead;
- byte[] data = new byte[buffersize];
- serialPort1.Read(data, 0, buffersize);
- this.BeginInvoke(bufferChanged, data, buffersize); //异步通过invoke调用事件
- System.Threading.Thread.Sleep(100); //线程挂起100毫秒,线程挂起不消耗CPU资源
-
- }
- }
在命名空间下面定义委托与事件:
- private delegate void UpdateBufferEventHandle(byte[] data, int bufferlen); //定义多重委托
- private event UpdateBufferEventHandle bufferChanged; //定义事件
收到多个字节之后的处理方法:
- private void HandleBuffer(byte[] data, int bufferlen) //接收到串口字节后事件处理方法
- {
- xxxxx//复杂的数据处理
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。