【话题】从串口读取数据的几个问题
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分
要看清除缓存没有 还有是否存在堵塞问题 |