日期:2014-05-17  浏览次数:20963 次

serialport的datareceived事件响应次数有问题
最近在用一个usb虚拟串口做个东西,用单片机的usb与pc传输数据。上位机采用调用cdc类,不过这部分驱动有st公司提供,遇到的问题是当单片机发送''abcd‘’和''ABCD‘’两个字符串时候,pc这边会偶尔出现将这两个字符串一次性接收,即接收到的是''abcdABCD‘’,而不是分开的两个字符串,也就说明本应该datareceived事件响应两次,结果只响应了一次,这是什么原因造成的?

------解决方案--------------------
引用:
而不是分开的两个字符串,也就说明本应该datareceived事件响应两次,结果只响应了一次,这是什么原因造成的?
你说它应该响应了两次,这又根据吗?请找出根据来。

打个比方,假设你预定了两个快件,它是一块送来、还是先后送来(如果一块送来你就拒收),你难道跟快递公司签订了协议?如果签订了协议,请找出协议来。
------解决方案--------------------
从串口接收到数据到进入DataReceived事件是存在一定时间间隔的,serialPort的ReceivedBytesThreshold默认为1,不知楼主有没改过。这个属性是设置设置 DataReceived 事件发生前内部输入缓冲区中的字节数,虽然设置成1,但是往往进入事件时读取的字节数并不是1,也就是从缓冲区有第一个字节起到进入数据读取缓冲区的这段时间里,缓冲区内又有数据进入,也许这是时间问题。
楼主有时一次性接收,有时分成两次接收,一是跟“abcd"和"ABCD"的发送时间间隔有关,间隔得稍长点,就会分为2次接收,间隔得短就有可能1次接收。二是跟PC有关系,之前有人告诉我可能跟系统进程间的调度有关系。