linux串口输出数据不对,linux串口传感器处理接收不完整,数据丢失问题分析

简介因为当前项目需要在一个linux系统下进行串口传感器的收发工作,该串口传感器的收发使用的是字节流专有协议,按照每一个字节的十六进制编码来确定协议数据。按照以往的思路,串口就是最简单的外设的思想,本想着就是一个小case,但没想到在windows下测试的好好的传感器数据到linux系统上就完全变了样子。。 原因分析经过一番查资料分析,原来linux的串口因为还有作为终端的功能,所以linux下...
摘要由CSDN通过智能技术生成

简介

因为当前项目需要在一个linux系统下进行串口传感器的收发工作,该串口传感器的收发使用的是字节流专有协议,按照每一个字节的十六进制编码来确定协议数据。按照以往的思路,串口就是最简单的外设的思想,本想着就是一个小case,但没想到在windows下测试的好好的传感器数据到linux系统上就完全变了样子。。

b3faf66e81be67d75dc35c48d9644e4b.png

原因分析

经过一番查资料分析,原来linux的串口因为还有作为终端的功能,所以linux下的串口的设置会比windows要丰富不少。而为了保持我们的十六进制数据保持原样的发送过来,必须将linux下的串口设置为原始输入模式,保留串口数据中的所有控制字,避免linux系统对控制字等数据进行转义。

在linux中,控制串口的转义方法等各类控制结构在初始化串口时的结构体options中。在设置校验位,数据长度,停止位的时候,也是这个结构体在起作用,其结构如下:

struct termios {

tcflag_t c_cflag/* 控制标志*/

tcflag_t c_iflag;/* 输入标志*/

tcflag_t c_oflag;/* 输出标志*/

tcflag_t c_lflag;/* 本地标志*/

tcflag_t c_cc[NCCS];/* 控制字符*/

};

想做到对这些结构体做到更深入的了解,可以参考另一篇文章:串口属性设置

而为了保持原始输入模式,我们需要控制的是输入标志和本地标志,将控制标志设置为屏蔽各种控制字,然后输入标志设置为屏蔽各种转义,最后控制字段如下:

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input LOCAL*/

options.c_oflag &= ~OPOST; /*Output*/

options.c_iflag &= ~(IXON | IXOFF | IXANY |BRKINT | ICRNL | ISTRIP );

在如此设置完成后,串口终于能够像pc一样正常的输出数据了!

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值