请教个实际问题,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事件的主要内容,如果未能解决你的问题,请参考以下文章