最近在linux系统中写了个串口接收程序,发送端依次从0x00~0xFF发送字符,但接收端某些字符老接收不到,分析及其解决方法如下: 一、只接收到数据: 05 06 07 08 09 0a
解决此问题之前我们先看终端I/O的两种输入处理模式: (1) 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求,
0x0a即'/n',以NL来表示,也就是说类似按了enter键,本行数据才输出,所以必须修改,将终端设置在 非规范方式输入处理。 在<termios.h>中,有如下定义 struct termios {
c_iflag由终端设备驱动程序用来控制输入特性(剥除输入字节的第8位,允许输 c_oflag则控制输出特性(执行输出处理,将新行映照为C R / L F等) c_cflag影响到UART串行线(忽略调制解调器的状态线,每个字符的一个或两个停止位等等),
options.c_lflag &= ~(ICANON ); 通过修改c_lflag本地模式,将ICANON属性去掉,ICANON就是规范化方式。
二、接收到数据: 04 05 06 07 08 09 0a 0b 0c 0a 0e 0f 其余数据全正确 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 其余数据全部正确 看,0d变成了0a c_iflag模式中,有ICRNL项,IGNCR项,将两者去掉: options.c_iflag &= ~(ICRNL|IGNCR)
至此:串口能接收到所有的数据。
|
|
来自: 汉江秋月夜 > 《1401-Linux串口》