hur.cn - 华软网

 热门搜索

串口通信问题:PurgeComm()函数调用问题

  作者:未知    来源:网络    更新时间:2011/9/28

 程序和下位机进行通讯 采用问答式通讯方式,即上位机发送命令,下位机返回数据,
 通讯时候通过长度 累计达到1000个字节的时候,接收接收。
 我每次在发送的时候都调用下面函数。想清除一次缓冲区

 但是时间长了,就接收不到数据了,软件重新启动就正常了。为什么??? 这样做有问题吗?

PurgeComm(COMDEV(npCommInfo),PURGE_RXCLEAR|PURGE_TXCLEAR| PURGE_RXABORT | PURGE_TXABORT); 
memset(npCommInfo->Queue, 0, 10000);
npCommInfo->HeadPtr=0;设置数据索引为0开始
---华软 网友回答---
收不到数据极有可能是死锁了,

发送的事情清除哪个缓存? 还是读写缓存全清?

串口有自己的接受缓存和发送缓存区,你readfile一次,取出多少就从接受缓存区中擦去多少数据。


严谨的方式,应当是一个线程负责readfile,将读出来的数据都放入一个缓存区中,

然后根据包头包尾解析每段协议。


串口传输中半包问题出现概率比较大,根据自己需求自己设计呗。
---华软网友回复---
看看龚建伟的串口书。

书上介绍的开源串口软件,我用的很好。连续好多天,接收发送数据上几十万,没问题。

---华软网友回复---
用线程的话应该考虑死锁问题,估计是缓冲区没有清空
最后不行了在分析一下数据包,看看有没有丢掉数据,导致不能顺利接受
---华软网友回复---
输入和输出全部清除。
看标志 PURGE_RXCLEAR|PURGE_TXCLEAR| PURGE_RXABORT | PURGE_TXABORT
由于以前的协议 没有报头和报尾,因此只有按长度截取。

有的时候 由于长度没有收够,导致无法解析。形成超时。
有的时候,截取的位置不对,导致校验和通不过,形成校验错误。

因此我在下发取数据命令之前,都对输入和输出缓存都进行了清空。
就是保证 每次接收的字符都是新传上来。



---华软网友回复---
继续求解      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。