当前位置:   article > 正文

C# 中串口SerialPort类接收多字节(使用委托进行之后的处理)_c#多字节

c#多字节

问题描述:

C# 中串口SerialPort类不能接收多字节,在SerialPort已经设置了ReceiveByteThreshold 触发read的字节数

                                                         

之前的串口接收事件如下:

  1. private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //串口接受数据事件
  2. {
  3. int buffersize = serialPort1.BytesToRead;
  4. byte[] data = new byte[buffersize];
  5. serialPort1.Read(data, 0, buffersize);
  6. textBox_Show.AppendText(buffersize.ToString()+ "\r\n");
  7. //label_Wait.Text = "缓冲" + buffersize.ToString();
  8. }

   

可以看到在上位机显示读取的字节数有30和3,除了30个字节之外,3个字节也触发了串口接收事件

              

 

目前的解决办法:

接收事件触发之后线程挂起100ms,这样每次基本上接收到100个字节左右(波特率9600Bps

最好别把数据处理的部分放在这个接收事件里面,这里使用到了异步委托

串口接收事件:

  1. private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //串口接受数据事件
  2. {
  3. if (serialPort1.IsOpen)
  4. {
  5. int buffersize = serialPort1.BytesToRead;
  6. byte[] data = new byte[buffersize];
  7. serialPort1.Read(data, 0, buffersize);
  8. this.BeginInvoke(bufferChanged, data, buffersize); //异步通过invoke调用事件
  9. System.Threading.Thread.Sleep(100); //线程挂起100毫秒,线程挂起不消耗CPU资源
  10. }
  11. }

在命名空间下面定义委托与事件:

  1. private delegate void UpdateBufferEventHandle(byte[] data, int bufferlen); //定义多重委托
  2. private event UpdateBufferEventHandle bufferChanged; //定义事件

 

收到多个字节之后的处理方法:

  1. private void HandleBuffer(byte[] data, int bufferlen) //接收到串口字节后事件处理方法
  2. {
  3. xxxxx//复杂的数据处理
  4. }

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/488587
推荐阅读
相关标签
  

闽ICP备14008679号