请教个实际问题,C# serialPort在读取数据有时候会连续触发DataReceived事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教个实际问题,C# serialPort在读取数据有时候会连续触发DataReceived事件相关的知识,希望对你有一定的参考价值。

我把波特率设置为115200;我传数据长度500字节到1000字节(理想是1200字节),我想在serialPort读取一次就把数据读完,但是实际情况中会触发2次DataReceived事件 。假如传总字节是500,情况一:第一次触发DataReceived事件 就会把500字节的数据全部读完,第二次触发DataReceived事件 得到的数据长度为0,我是用sp.BytesToRead判断的;情况二:第一次触发DataReceived事件为499,第二次触发DataReceived事件的数据长度为1了;问题是怎么设置可以避免情况二,希望是读取一次就把500字节读完,请大家帮帮忙啊!

设置serialPort的某一属性,使缓存达字节到设置值,才触发DataReceived事件追问

我 的属性是这样的,其中readbuffersize和writebuffersize开始默认值和我后面设置的值还是存在我上面的情况,请帮忙看下 谢谢

追答

ReceiveBytesThreshol改为500

追问

谢谢你的回答,我刚刚去测试了下,这个属性我理解为没有达到这个设定值的话就不会执行DataReceived事件,但是我读取的数据也有可能低于500,同时也不排除只有一个字节的时候。所以这个属性无法满足要求,请问还有没有其他的方法啊

参考技术A 没有碰到你说的情况,是不是你设置的有问题?

把代码贴出来看看吧追问

上面是我的代码,我用一个移动设备,可以理解成扫描枪,触发这个事件后,扫描一次会弹出2次MessageBox.Show,就是我问题描述的情况了,请帮忙看下 谢谢

追答

你串口读入的是16进制数据吗?

还有你的接收缓存区,为什么要设置成动态的?

追问

sp.BytesToRead是获取串口byte数据的总长度,当然得到的数据就是byte[],所以我问题表述中出现情况二,那么得到的数组就会少一个字节,得到不完整的数据,重点是为什么会扫描一次会弹出2次MessageBox.Show,请问有没有这方面类似的情况啊或者说解决方法的

追答

你怎么就没有明白我的意思??
要是十六进制数据,采用数组的形式接收;
如果接收的是字符串,采用string的方式接收;
还有接收缓冲区,直接设置一个固定值,不要去动态的随着接收长度去分配。
你出现的问题,肯定和我上面提到的有关系,明白???

追问

谢谢你的回答,我的数据是16进制的,而我用byte[] 来接受它,关于你说的接受缓冲区是设置固定值,我确实没有理解到是什么意思,请问指动态值是指byte[sp.BytesToRead]这句吗?

追答你这样试试吧,满意请采纳
  byte[] buffer = new Byte[2048];                  //创建缓冲区 
  int a1 = serialPort1.BytesToRead;
  serialPort1.Read(buffer, 0, serialPort1.BytesToRead);
  buffer[a1] = (Byte)'\\0';

本回答被提问者采纳

以上是关于请教个实际问题,C# serialPort在读取数据有时候会连续触发DataReceived事件的主要内容,如果未能解决你的问题,请参考以下文章

c# serialport读取不限数量的16进制数据

c#如何实现串口通信读取数据

刚刚读取刚打开的SerialPort时,只读取一个字节

请教c#读取二进制文件的问题

使用 SerialPort 和 C# 中的线程“安全句柄已关闭”

C#的SerialPort串口程序设计总结