本人现在做了一个软件,主要有串口通讯的功能,其中读写串口的操作都放在单独线程中,根据事先规定的协议通过帧头判断一帧的开始,可能会有连帧。本人直接用API函数实现的串口读写功能,利用WaitCommEvent来得知串口是否有数据到达,然后可获取串口数据的长度,一般情况下可以正常收到想要的数据,但是这段时间发现,当数据有连帧且每帧数据较长时,并不能一次全部获取,比如30个字节数据,可能会分成25,5或13,17或24,6或21,9等组合的形式两次获取,但是我的程序并不能处理这样的数据,因为我并不知道会有几个连帧,每帧长度也不定,我只能做到一旦有数据到达,我就获取,并且从此次获取的数据中找到有几帧然后再作处理,处理完后就会清空此次数据。因此当以上问题出现时,就会至少丢掉一帧数据。通过观察,被丢的数据与上次或下次到达的数据合起来正好是正确的一帧。请问高手们,谁有这方面的经验,给小弟我指点指点,是不是有哪个地方疏忽了?急呀!!!!!!谢了!!!!!!!!

解决方案 »

  1.   

    明明是两帧数据一起发过来,按照我的程序设计来看,这两帧完全可以被程序解出来,但是事实并不是这样,单片机通过串口发送连续的两帧数据到本机串口,此时我的读串口的线程可以检测到有数据到,且可以知道有多少数据到了,但是奇怪的事就在这时发生了,假设,每帧15个字节,一共两帧同样长度的连在一起发过来,一共就是30个字节的数据,这时发现当有数据到达时,我只收到21个字节,这就表示有一帧数据丢掉了一部分,但是有时候另一部分可能会在下次一起到来,但不管怎样,我的程序只处理一次数据的到达,一旦程序检测完此次到达的全部数据,那么程序将在处理完这些数据后,然后再重新获取新的数据,我就是无法控制当两帧数据(也可能是一帧很长的数据)被分两次或多次发送时应该如何处理?????????急呀!!!!
      

  2.   

    难道每次通讯,双方都没说明本次传输数据的长度?
      

  3.   

    就算说明了又怎样,连帧呢?你知道有几个连帧吗?我不知道,不好控制。每次传送的数据不是定长的!
      

  4.   

    找到几帧就处理几帧,然后只清除这几帧的数据。以后再收到的数据,追加到上次剩余的数据后面,再接着处理。可以自己做一个缓存,保留尚未处理的数据。
      

  5.   

    多余的数据可能是一帧的前部分也可能是后部分,就算我存下来了,下次再来数据我应该是与下次来的数据里的多余的那部分前连接还是后连接呢?
      

  6.   

    帧与帧中间总是有个分帧标记吧,串口数据肯定是有序发送的哈。第一次分析数据的时候,先找到第一个分帧标记,前面的扔了,后面的放到缓存;
    在缓存里找分帧标记,找到后,当前位置之前的为一帧,交上层处理数据,从缓冲中清除当前位置之前的数据;剩下的接着找分帧标记,找到一帧交一帧,直到找不到,剩下的即为最后一帧的前部分;
    下次再来数据,拼在后面,从头再找分帧标记,找到一帧交一帧,如此一直处理下去。错不了的,相信我,呵呵。
      

  7.   

    哎,你们这些人怎么来的这么晚,我昨晚已经搞定,我也是像你那样做的,还不错吧!!!!!结贴哟!