问题描述:
在做一个Linux串口通信协议,我需要一次性接收完下位机发来的数据。但用我之前
借用的Linux串口程序在Ubuntu上使用没问题,但下载到目标板上的时候问题了,只
能一次接收到8个字节。导致我无法正确解析数据!因为我设计的方式需要一次性
接收到数据做出的数据解析才合理。
----------------------------------------------------------------------------------------------------------------
问题解决:
通过上网查资料终于找到问题的原因,原因是struct termios 这个结构体中c_cc的成员
的VMIN, VTIME所控制的特殊字符设置的值原因,起初值是
VMIN = 1;
VTIME =0;
解释之前先对这俩个值做个简单介绍,具体介绍百度可知。
这两个值只用于非标准模式,两者结合共同控制对输入的读取方式,还能控制在一个程
序试图与一个终端关联的文件描述符时将发生的情况
MIN = 0, TIME = 0时:read立即返回,如果有待处理的字符,它们就会被返回,如果没有,read调用返回0,且不读取任何字符
MIN = 0, TIME > 0时:有字符处理或经过TIME个0.1秒后返回
MIN > 0, TIME = 0时:read一直等待,直到有MIN个字符可以读取,返回值是字符的数量.到达文件尾时返回0
MIN > 0, TIME > 0时:read调用时,它会等待接收一个字符.在接收到第一个字符及其后续的每个字符后,启用一个字符间隔定时器.当有MIN个字符可读或两字符间的时间间隔超进TIME个0.1秒时,read返回
通过设置MIN和TIME值,我们可以逐个字符地对输入进行处理。
到了这里应该能有点明白了,但我在实际操作时却不是这样,例如:
VMIN = 1;
VTIME = 10;
就是说俩个字节之间的时间间隔不能超过1s,如果超过了,read返回。但结果还是8个字节。于是我将VMIN = 2,MIN = 8都是一样的结果,直到VMIN = 9时,接收到的字节就变成16了不知道为什么,就在那胡思乱想,就猜测它应该是以8的倍数来接收的,于是我将VMIN = 1024,结果居然是8个字节。分析了前面的几次结果,就想VMIN % 8 = 0的话应该接收结果是8,如果不等于0结果就是(VMIN / 8 + 1)*8;于是我就用VMIN = (1024 - 1)果然结果是我发多少就接收多少。因为VTIME = 10,就不会阻塞,直到接收到1024个字节。 如果VTIME = 0,就必须接收到1024个字节read才返回,当然这里使用open和fcntl时使用到了NDELAY。