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

解决方案 »

  1.   

    其实要找根据很简单的,在DataReceived事件里加个显示功能,定义局部变量存储接收到的数据并在textBox里显示出来,如果是一次性接收显示的就是abcdABCD,如果是两次接收,第二次的显示会覆盖第一次的数据,那么显示的就是ABCD。
    或者定义个全局计数变量好了,每进入一次DataReceived事件就+1,最后看次数。
      

  2.   

    从串口接收到数据到进入DataReceived事件是存在一定时间间隔的,serialPort的ReceivedBytesThreshold默认为1,不知楼主有没改过。这个属性是设置设置 DataReceived 事件发生前内部输入缓冲区中的字节数,虽然设置成1,但是往往进入事件时读取的字节数并不是1,也就是从缓冲区有第一个字节起到进入数据读取缓冲区的这段时间里,缓冲区内又有数据进入,也许这是时间问题。
    楼主有时一次性接收,有时分成两次接收,一是跟“abcd"和"ABCD"的发送时间间隔有关,间隔得稍长点,就会分为2次接收,间隔得短就有可能1次接收。二是跟PC有关系,之前有人告诉我可能跟系统进程间的调度有关系。