Linux串口编程的的一点自我发现

问题描述:

在做一个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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值