分享

从串口读取数据的几个问题

 筱肆 2014-06-14

VC/MFC讨论

共有1719位成员   人气指数 -   最新排名 -

【话题】从串口读取数据的几个问题

2009-04-09 17:13:51 来自:lovelyhee 浏览数:74次
使用重叠方式来读写串口数据。对方是个工控机,返回的数据的长度是不可知的,而且有可能超出设的缓存区的大小。

ReadFile读取串口的数据的时候,会要求设一个要读取的数据的数量,但在数据长度不可知,且可能超出预设缓存区的情况下,有什么办法可以在重叠的方式下,取到所有的数据吗?

另外,串口读写缓存区的大小最大可以设到多大?

之前,我是用阻塞方式来读写串口的,设了超时,以单字节的方式读取,这样能保证读到所有的数据。但这种方式有两个弊端,对于那些返回数据很少的命令,执行时间太长了;对于那些要等待较长的时间,才能收到第一个字符的命令,这种方式往往取不到返回值。
 
小管子回复于10日07点08分 
这种接收的数据没有什么识别码,所以一般都是发命令,然后收数据,接收完了,再发下一条命令,再收数据......
所以主程序也没有办法来判断。

我想了一个办法,不知是否可行,把太大的数据分几次接收,每一次ReadFile要接收数据的大小都设为缓存区的大小,直到接收到的数据大小小于这个设定值,就认为数据接收完了。就是不知道使用分次接收的方式,会不会导致数据丢失。

系统对于这种数量大于缓存区的数据,是怎样处理的:满了以后,等待程序读取,读完后,清空缓存区,再输入数据吗?
 
xuelian回复于10日15点46分 
那首先要假设你的接收缓存足够大
 
梅一丁回复于11日06点43分 
读完数据返回

如果该时间内没读到认为是超时
 
庞淇尹回复于11日16点30分 
什么条件也没有?那样理论上就只剩下超时判断了,那岂不是没有标准了。
 
hbj1013351回复于12日09点16分 
比如我的串口程序中,有5个字节的命令头,串口线程死读,分析线程不停判断是否收到了命令头,再根据命令头判断后续数据是否完全了,如果全了的话,分析线程将完整的数据拷贝到主程序的缓冲中,然后通知主程序完整数据到达。
 
我家孩儿回复于12日20点56分 
缓存设置为516整数倍

通过实际得到的缓存来计算
不够的第二次接收
 
wangziqi1回复于13日15点37分 
我每次重叠收串口数据都是另存到其他一个地方,想多大就多大。如果对方每次发过来的数据肯定都是完整的,那你的事情就是一个线程死等着读,主程序则有条件的进行判断。
 
美思静回复于14日11点43分 
可以分块读取,然后最终放到一个大数据块中,统一处理
 
density回复于15日08点48分 


那就是串口的缓存只要是516的整数倍,大小可以随意设置?
我看有些帖子说,虽然可以设一个很大的值,但系统可能并不会使用这个设置。
 
开心果回复于16日07点29分 
或者,对方的串口发送完数据后,是否会有什么信号发过来,然后主机这边的会检测到一个信号,然后就终止接收?
 
皮皮娘回复于16日23点24分 
实际上你要一次接收超过2048个的没大意义了吧
你可以分次收阿


那么大的数据在物理上传输不看好
如果此时串口断了呢
 
zzz86回复于17日04点48分 
重叠方式读串口数据的时候,如果实际要读的数据少于ReadFile中设定的大小,这种情况下,是读完数据后就返回,还是一直要等到超时才会返回?
 
wgf0501回复于17日07点00分 
使用过程中发现了一个奇怪的问题,命令发送成功了,但大部分命令读不到返回的数据,有个别有的,也只是收到了几个字符。
但我单步调试的时候,发现读取的字符是完整的。
 
sichanglin回复于17日09点00分 
要看清除缓存没有

还有是否存在堵塞问题

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多