从串口读取数据的几个问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从串口读取数据的几个问题
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分
要看清除缓存没有
还有是否存在堵塞问题。