Linux下接收串口数据0x0d变0X0a问题
来源:互联网 发布:懒人js特效 编辑:程序博客网 时间:2024/05/17 01:15
许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。不用说也知道,这几个肯定是特殊字符,被用作特殊控制了。关掉ICRNL和IXON选项即可解决。 c_iflag &= ~(ICRNL | IXON); 0x0d 回车符CR 0x11 ^Q VSTART字符 0x13 ^S VSTOP字符 I CRNL 将输入的CR转换为NL IXON 使起动/停止输出控制流起作用在《UNIX环境高级编程第二版》第18章第11小节看到把终端I/O设置为原始模式(串口通讯就是终端I/O的原始模式)时输入属性设置为term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
tcgetattr
tcgetattr是一个函数,成功返回零;失败返回非零,发生失败接口将设置errno错误标识。
- 中文名
- tcgetattr
- 头文件
- #include<termios.h>
- 函数原型
- int tcgetattr(int fd,
- 返回值
- 成功返回零;失败返回非零
目录
- 1头文件
- 2函数原型
- 3说明
- 4范例
头文件
编辑#include<termios.h>
函数原型
编辑int tcgetattr(int fd, struct termios *termios_p);
说明
编辑tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中,该结构体一般包括如下的成员:
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[NCCS];
其具体意义如下。
c_iflag:输入模式标志,控制终端输入方式,具体参数如表1所示。
表1 c_iflag参数表
键 值
说 明
IGNBRK
忽略BREAK键输入
BRKINT
如果设置了IGNBRK,BREAK键输入将被忽略
IGNPAR
忽略奇偶校验错误
PARMRK
标识奇偶校验错误
INPCK
允许输入奇偶校验
ISTRIP
去除字符的第8个比特
INLCR
将输入的NL(换行)转换成CR(回车)
IGNCR
忽略输入的回车
ICRNL
将输入的回车转化成换行(如果IGNCR未设置的情况下)
IUCLC
将输入的大写字符转换成小写字符(非POSIX)
IXON
允许输出时对XON/XOFF流进行控制
IXANY
输入任何字符将重启停止的输出
IXOFF
允许输入时对XON/XOFF流进行控制
IMAXBEL
当输入队列满的时候开始响铃
c_oflag:输出模式标志,控制终端输出方式,具体参数如表2所示。
表2 c_oflag参数
键 值
说 明
OPOST
处理后输出
OLCUC
将输出的小写字符转换成大写字符(非POSIX)
ONLCR
将输出的NL(换行)转换成CR(回车)及NL(换行)
OCRNL
将输出的CR(回车)转换成NL(换行)
ONOCR
第一行不输出回车符
ONLRET
不输出回车符
OFILL
发送填充字符以延迟终端输出
OFDEL
以ASCII码的DEL作为填充字符,如果未设置该参数,填充字符为NUL
NLDLY
换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s)
CRDLY
回车延迟,取值范围为:CR0、CR1、CR2和 CR3
TABDLY
水平制表符输出延迟,取值范围为:TAB0、TAB1、TAB2和TAB3
BSDLY
空格输出延迟,可以取BS0或BS1
VTDLY
垂直制表符输出延迟,可以取VT0或VT1
FFDLY
换页延迟,可以取FF0或FF1
c_cflag:控制模式标志,指定终端硬件控制信息,具体参数如表3所示。
表3 c_cflag参数
键 值
说 明
CBAUD
波特率(4+1位)(非POSIX)
CBAUDEX
附加波特率(1位)(非POSIX)
CSIZE
字符长度,取值范围为CS5、CS6、CS7或CS8
CSTOPB
设置两个停止位
CREAD
使用接收器
PARENB
使用奇偶校验
PARODD
对输入使用奇偶校验,对输出使用偶校验
HUPCL
关闭设备时挂起
CLOCAL
忽略调制解调器线路状态
CRTSCTS
使用RTS/CTS流控制
c_lflag:本地模式标志,控制终端编辑功能,具体参数如表4所示。
表4 c_lflag参数
键 值
说 明
ISIG
当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号
ICANON
使用标准输入模式
XCASE
在ICANON和XCASE同时设置的情况下,终端只使用大写。
ECHO
显示输入字符
ECHOE
如果ICANON同时设置,ERASE将删除输入的字符
ECHOK
如果ICANON同时设置,KILL将删除当前行
ECHONL
如果ICANON同时设置,即使ECHO没有设置依然显示换行符
ECHOPRT
如果ECHO和ICANON同时设置,将删除打印出的字符(非POSIX)
TOSTOP
向后台输出发送SIGTTOU信号
c_cc[NCCS]:控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等。c_cc中定义了如表5所示的控制字符。
表5 c_cc支持的控制字符
宏
说 明
宏
说 明
VINTR
Interrupt字符
VEOL
附加的End-of-file字符
VQUIT
Quit字符
VTIME
非规范模式读取时的超时时间
VERASE
Erase字符
VSTOP
Stop字符
VKILL
Kill字符
VSTART
Start字符
VEOF
End-of-file字符
VSUSP
Suspend字符
VMIN
非规范模式读取时的最小字符数
tcsetattr函数用于设置终端的相关参数。参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数。
optional_actions可以取如下的值:
TCSANOW:不等数据传输完毕就立即改变属性。
TCSADRAIN:等待所有数据传输结束才改变属性。
TCSAFLUSH:清空输入输出缓冲区才改变属性。
错误信息:
EBADF:非法的文件描述符。
EINTR:tcsetattr函数调用被信号中断。
EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。
ENCTTY:非终端的文件描述符。
0 0
- Linux下接收串口数据0x0d变0X0a问题
- Linux串口接收程序会将0x0D转换成0x0A的问题记录
- 0x0d 0x0a
- '0x0a ', '0x0d
- 0x0D && 0x0A
- linux C语言 串口 上层发送0x0A,底层却发送了0x0D 0x0A两个字节的解决方法
- 随手记, C回车换行,0x0d 0x0a,WINDOWS下fgetc()一次读入,即\n,LINUX下fgetc()需要分两次读入0x0d, 0x0a
- 0x0d和0x0a
- 0x0D和0x0A
- linux 串口接收不到0x11、0x13、0x0d
- linux 串口接收不到0x11, 0x0d, 0x13
- 回车换行问题0x0D和0x0A
- Windows平台下fwrite函数0x0A变成0x0D 0x0A
- Windows平台下fwrite函数0x0A变成0x0D 0x0A
- Windows平台下fwrite函数0x0A变成0x0D 0x0A
- 串口接收数据错误0D变0A问题
- '0x0a ', '0x0d ' : "/n"&"/r"
- 彻底搞定0x0d和0x0a
- 优化DEDECMS模板 让织梦CMS程序生成html页面更快些
- C++指针小结:由一个问题引发的。。。。。。。。。。。。。。。。。。。
- HDU 2124Repair the Wall(贪心)
- Codeforces Round #363 (Div. 2)699A,699B,698A
- POJ 1328Radar Installation
- Linux下接收串口数据0x0d变0X0a问题
- 在屏幕中显示下拉表框
- 010-字符个数统计
- 递归打印一个数所有加和的方式
- jQuery $.ajax()通过本地服务器访问到远程服务器,解决远程问题。
- Spark中使用Java编程的常用方法
- 151. Reverse Words in a String
- 织梦CMS5.7版自动给图片添加alt属性的方法
- hdu1885Key Task (BFS+状态压缩)