linux串口知识深入--收到数据异常问题处理

对于串口并不陌生,使用了N遍,总以为理解很深刻,实际上还有很多细节未知。

近期在处理新的板子发现串口收发很不正常,经常少一些数据、莫名其妙数据被串改了,导致校验通不过,现象很诡异

例如存在以下几种现象,可能就是这个问题:

  • 程序在接收数据时,0x13,0x11 总是收不到。
  • 串口发送方发 0x0D,接收方收到 0x0A;
  • 串口发送方发 0x0A,接收方收到 0x0D。
  • 有时候,在用write发送数据时没有键入回车,信息就发送不出去

这样当然不行

主要原因串口在默认情况下,会进行自动字符转换或一些特殊处理:

  • c_cc数组的VSTART和VSTOP元素被设定成DC1和DC3,代表ASCII标准的XON和XOFF字符
  • 在输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的
  • 在串口设置中c_iflag和c_oflag中存在从NL-CR和CR-NL的映射,即串口能把回车和换行当成同一个字符

这些处理,感觉很智能(可能在一些特殊场合下,比较方便),实际上会给我们带来一些麻烦(我们大部分是传输二进制数据),如果不知道原因的话,往往需要花费很大精力去找原因

主要涉及到几个参数:

tcflag_t c_iflag; /* 输入模式 */

tcflag_t c_oflag; /* 输出模式 */

tcflag_t c_cflag; /* 控制模式 */

tcflag_t c_lflag; /* 本地模式 */

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

知道原因,就好改,网上也有很实例:

opt.c_iflag &= ~(ICRNL | INLCR);

opt.c_iflag &= ~(IXON |IXOFF | IXANY);

opt.c_oflag &= ~(ONLCR |OCRNL);

  

也可以参考如下代码:也可以

  

opt.c_oflag = 0; ///< 输出模式
opt.c_lflag = 0;	///< 本地模式

opt.c_iflag = IGNBRK;	///< 输入模式
opt.c_iflag &= ~(IXON|IXOFF|IXANY);
opt.c_cc[VMIN] = 1;	///< 最少1字节
opt.c_cc[VTIME] = 1;	///< Wait time

  

其实还有很多参数,有兴趣的可以详细了解下。

原文地址:https://www.cnblogs.com/winafa/p/11888635.html

时间: 2024-08-30 13:26:50

linux串口知识深入--收到数据异常问题处理的相关文章

linux串口驱动分析——发送数据

一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口.步骤不再赘述. static const struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_wr

Linux串口接收不到0X11数据

转自:http://www.2cto.com/os/201302/189931.html linux串口接收不到0x11解决 网上许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉.不用说也知道,这几个肯定是特殊字符,被用作特殊控制了.关掉ICRNL和IXON选项即可解决. www.2cto.com c_iflag &= ~(ICRNL | IXO

(转)Linux基础知识学习

Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过修改配置文件来完成. 1.1.Linux磁盘分区 Linux可以将磁盘分为多个分区,每个分区可以被当做一个独立的磁盘使用,磁盘类型:主分区.扩展分区.逻辑分区. 主分区标记为活动,用于操作系统的引导,一块磁盘最多划分4个主分区,主分区存放操作系统的文件或用户数据. 扩展分区:主分区小于4个时才可以划

linux串口驱动分析

linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作.UART 使用系统时钟能够支持最高 115.2Kbps 的波特率.每一个 UART 通道对于接收器和发送器包含了 2 个 64 位的 FIFO. 寄存器 名称 地址 在linux中的描写叙述 (2410 和 2440 处理器对内存地址映射关系同样) UART 线性控制寄存器(ULCONn) ULC

linux串口编程参数配置详解

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函数库定义 #include <unistd.h>       //Unix标准函数定义 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>          //文件控制定义 #incl

linux串口编程参数配置详解(转)

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义#include <stdlib.h>        //标准函数库定义#include <unistd.h>       //Unix标准函数定义#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>          //文件控制定义#include &l

linux串口编程 select

1.串口的阻塞和非阻塞 阻塞的定义: 对于read,block指当串口输入缓冲区没有数据的时候,read函数将会阻塞在这里,一直到串口输入缓冲区中有数据可读取,read读到了需要的字节数之后,返回值为读到的字节数,然后整个程序才继续运行下去:(收) 对于write,block指当串口输出缓冲区满,或剩下的空间小于将要写入的字节数,则write将阻塞,一直到串口输出缓冲区中剩下的空间大于等于将要写入的字节数,执行写入操作,返回写入的字节数,然后整个程序才继续运行下去.(发) 非阻塞的定义: 对于r

Linux 小知识翻译 - 「代理服务器」

这回聊聊「代理服务器」. 在公司里,不通过代理服务器无法连接互联网的,由于代理服务器的原因,有些服务的使用是受到限制的. 有人可能会觉得为什么会存在这种东西?(这里指代理服务器) Proxy本来的意思是「代理服务器」.代理服务器就是客户端和服务器中间的一层,对服务器来说,它就是客户端,对客户端来说,它就是服务器. 最好理解的就是HTTP代理,「当客户端有请求的时候,HTTP代理获得这个请求,然后代替客户端将这个请求发给服务器,然后将服务器返回的结果返回给客户端」. 那么为什么需要中间这层代理呢?

Linux串口通讯

一.串口简介 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口.虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代:而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之.但是,一方面因为串口本身造价便宜技术成熟,另一方面因为