最近在linux系统中写了个串口接收程序,发送端依次从0x00~0xFF发送字符,但接收端某些字符老接收不到,分析及其解决方法如下:

一、只接收到数据:

05 06 07 08 09 0a

解决此问题之前我们先看终端I/O的两种输入处理模式:

(1) 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求,

终端驱动程序最多返回一行。

(2) 非规范方式输入处理。输入字符不以行为单位进行装配。

如果不作特殊处理,则默认方式是规范方式。例如:若s h e l l的标准输入、输出是终端,在

用r

e a d和w r i t e将标准输入复制到标准输出时,终端以规范方式进行工作,每次r e a d最多返回一行。处理整个屏幕的程序,例如v

i编辑程序使用非规范方式,其原因是其命令是由不以新行符终止的一个或几个字符组成的。另外,该编辑程序使用了若干特殊字符作为编辑命令,所以它也不希望

系统对特殊字符进行处理。例如, C t r l - D字符通常是终端的文件结束符,但在v i中它是向下滚动半个屏幕的命令。

0x0a即'/n',以NL来表示,也就是说类似按了enter键,本行数据才输出,所以必须修改,将终端设置在 非规范方式输入处理。

在中,有如下定义

struct termios {

tcflag_t c_iflag;  /* input mode flags */

tcflag_t c_oflag;  /* output mode flags */

tcflag_t c_cflag;  /* control mode flags */

tcflag_t c_lflag;  /* local mode flags */

cc_t c_line;   /* line discipline */

cc_t c_cc[NCCS];  /* control characters */

};

c_iflag由终端设备驱动程序用来控制输入特性(剥除输入字节的第8位,允许输

入奇偶校验等等)

c_oflag则控制输出特性(执行输出处理,将新行映照为C R / L F等)

c_cflag影响到UART串行线(忽略调制解调器的状态线,每个字符的一个或两个停止位等等),

c_lflag影响驱动程序和用户之间的界面(回送的开或关,可视的擦除符,允许终端产生的信

号,对后台作业输出的控制停止信号等)。

修改非规范方式输入处理,如下:struct termios options;

tcgetattr( fd,&options)

options.c_lflag &= ~(ICANON );

通过修改c_lflag本地模式,将ICANON属性去掉,ICANON就是规范化方式。

二、接收到数据:

04 05 06 07 08 09 0a 0b 0c 0a 0e 0f

10 11 12 1d 1e 1f ……

其余数据全正确

03以前的数据全部没有,而0x03相当于 ^c, 即CTRL+C, ^c, ^?由ISIG来控制,那么去除该控制,应该就可以显示03了,再次修改为:

options.c_lflag &= ~(ICANON |ISIG);

三、接收到数据:

00 01 02 03 04 05 06 07 08 09 0a 0b

0c 0a 0e 0f ……

其余数据全部正确

看,0d变成了0a

c_iflag模式中,有ICRNL项,IGNCR项,将两者去掉:

options.c_iflag &= ~(ICRNL|IGNCR)

至此:串口能接收到所有的数据。

linux从串口接收数据丢失_Linux系统下串口接收数据,部分特殊字符丢失的解决方法...相关推荐

  1. 深度linux桌面没有图标,在deepin系统下topbar更新后托盘不显示图标的解决方法

    在deepin操作系统下没更新之前打开QQ会在topbar里显示QQ图标,打开其他的软件会在topbar里显示打开软件的图标,但是更新之后就不显示了,而且是我安装的所有wine(迅雷.百度网盘.QQ) ...

  2. win7桌面图标计算机打不开,win7系统下双击电脑桌面图标打不开的解决方法

    现如今,电脑可以说已经普及到千家万户了,每个家庭都会拥有一台或两台电脑.因此,在使用过程中难免遇到很多的问题,比如最近就有不少用户会遇到当要双击桌面的图标的时候发现图标打不开,尝试了杀毒软件也没有效果 ...

  3. android默认smb用户名和密码错误,win7系统下连接SMB提示用户名密码错误的解决方法...

    有很多电视都可以通过SMB协议和电脑连接,但是有不少win7系统用户在连接SMB的时候,按要求输入用户名和密码之后却提示用户名密码错误,该怎么办呢,本文就给大家讲解一下win7系统下连接SMB提示用户 ...

  4. win10打开网路邻居计算机,win10系统下网上邻居不能访问其他电脑的解决方法

    在 1.首先,右击桌面左下角的"Windows"按钮,从其 2.从打开的"运行"窗口中,输入命令"regedit"并按回车即可打开注册表编辑 ...

  5. php用360浏览器显示不正常,win10系统下360浏览器网页显示不正常的解决方法

    win10系统下360浏览器网页显示不正常怎么办?这是最近不少朋友都向小编咨询的问题.他们表示若干页面在360的浏览器上显示不正常,可是在其他的浏览器上却都是正常状态.那么,问题到底出在哪?下面,系统 ...

  6. w10无法访问其他计算机,win10系统下网上邻居不能访问其他电脑的解决方法

    在win10系统中,许多用户为了方便多人共享文件或者打印机等,就会在局域网中进行共享,正常情况下我们可以通过局域网访问其他同事的电脑,但是win10系统用户却遇到网上邻居不能访问其他电脑的情况,该如何 ...

  7. xp系统打不开excel服务器,xp系统下excel表格链接无法点击的解决方法

    在使用excel表格过程中,发现表格中的很多网址链接都无法点击打开.那么,我们该如何将其改成可点击的网址链接,方便快捷的打开网址?接下来,小编就以windowsxp系统为例,给大家分享excel表格链 ...

  8. win8.1 android驱动安装失败,win8.1系统下英伟达驱动安装失败的解决方法

    当我们在安装完win8.1系统的时候,总是要安装各种各样的驱动,然而有不少win8.1系统用户反映说遇到英伟达驱动安装失败的情况,遇到这样的问题该怎么办呢,现在随小编一起来看看win8.1系统下英伟达 ...

  9. 主板有电无法启动_win7系统下主板可以通电但不能启动的解决方法

    主板是电脑中重要的部件之一,然而有时候会遇到一些故障,比如有win7系统用户反映说遇到主板可以通电,但是不能启动的情况,这是怎么回事呢,现在给大家讲解一下win7系统下主板可以通电但不能启动的解决方法 ...

最新文章

  1. 我看ITIL在中国(三):嫁接的精髓
  2. 智能车竞赛计时系统感应线圈放在节能充电线圈上输出电压会多大?
  3. React-Native中的flexbox布局的使用
  4. BP神经网络(检测故障的实例)
  5. java类的定义的实例_《Java基础知识》Java类的定义及其实例化
  6. linux查看历史的所有命令,linux查看历史命令history
  7. php array_search多条件,php使用array_search与array_column函数实现二维数组内元素查找...
  8. pytorch数据增强
  9. Ajax开发框架(下)[整理]
  10. 用Python快速实现YOLO目标检测
  11. 马尔可夫链 (Markov Chains)
  12. Growing Mushrooms
  13. WPF游戏开发——小鸡快跑
  14. 微信支付服务器端php,APP微信支付php服务端函数方法
  15. 摄像头各参数的意义_手机摄像头的一些主要参数表达了什么意思?
  16. 关于解决win10的 tencent qqmail plugin 卸载不了的问题
  17. FreeRTOS 队列管理
  18. 整理 华为AP-3010DN_V2配置创建wifi
  19. 汽车发动机如何做保养,名悦集团教你几个小技巧
  20. 老说技术更迭快,可十年到底可以淘汰多少知识?

热门文章

  1. 验证码机制之验证码暴力破解
  2. 现代计算机控制理论及应用王万良 pdf,计算机}j现代化.PDF
  3. vue3使用echarts并封装echarts组件
  4. 围观新版香港身份证与OCR识别完美搭配
  5. Springboot 实现 PC端 微信扫码登录
  6. 查看linux centos ftp服务,Centos7开启FTP服务
  7. 世界500强和中国500强企业名单(2004年度前100名)
  8. dwasp连接mysql_asp连接access数据库代码(ASP连接ACCESS数据库方式方法)包含.mdb和.accdb两种格式...
  9. 分类算法 - K-近邻算法(附案例及测试数据)
  10. 爬虫常用数据提取方式:正则、xpath、beautifulsoup