问题描述:
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//复杂的数据处理
}