Linux下串口接收到0x0D自动变为0x0A问题
2020年8月7日
用串口发送十六进制数据0x0D时,在嵌入式linux下打印出来发现变成了0x0A,查询资料发现,0x0D对应的ASCII码是CR (carriage return),即回车键,0x0A对应的ASCII码为LF (NL line feed, new line),即换行键。
0x0D | CR | 回车键 |
---|---|---|
0x0A | LF | 换行键 |
查资料发现不止是0x0D,还有0x11, 0x13 都会出现错误。
- 通过设置串口参数,可以解决以上问题。
在配置串口时,添加上以下语句:
options.c_iflag &= ~ICRNL; //禁止将输入的CR转换为NL
即可 解决0x0D被转换为0x0A问题。
ICRNL 将输入的回车转化成换行(如果IGNCR未设置的情况下),此处取反,即禁止转换。
- 下面看一下0x11 0x13的问题,这两个数值的含义:
0x11 ^Q VSTART字符
0x13 ^S VSTOP字符
在配置串口时,添加上以下语句:
options.c_iflag &= ~(IXON); //清bit位 关闭流控字符
即可解决。
参考文章列出了更多设置串口时选项说明:
https://blog.csdn.net/jinchengzhou/article/details/52005132