linux串口数据传输出现问题的几点总结

(一)很多时候当在使用串口的时候你会发现在read串口设备时会出现当机现象,出现这种现象的原因可能是你在open设备的时候没有使用非阻塞的方式打开,在使用串口发送数据和接收数据的时候,或者注意select的配合使用达到非阻塞的读取。

(二)在系统头文件中定义了终端控制结构struct termios,tcgetattr()和tcsetattr()两个系统函数获得和设置这些属性。结构struct termios中的域描述的主要属性包括:

c_cflag  : 控制选项
c_lflag  : 线选项
c_iflag  : 输入选项
c_oflag  :输出选项
c_cc    :控制字符
c_ispeed :输入数据波特率
c_ospeed :输出数据波特率


如果要设置某个选项,那么就使用"|="运算,如果关闭某个选项就使用"&="和"~"运算。本文使用的各个选项的意义定义如下:

c_cflag: CLOCAL 本地模式,不改变端口的所有者
         CREAD  表示使能数据接收器
         PARENB  表示偶校验
         PARODD 表示奇校验
CSTOPB  使用两个停止位
CSIZE    对数据的bit使用掩码
CS8      数据宽度是8bit
c_lflag:  ICANON 使能规范输入,否则使用原始数据(本文使用)
ECHO    回送(echo)输入数据
ECHOE   回送擦除字符
ISIG      使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信号
c_iflag:  IXON     使能输出软件控制
         IXOFF    使能输入软件控制
         IXANY    允许任何字符再次开启数据流
         INLCR    把字符NL(0A)映射到CR(0D)
         IGNCR    忽略字符CR(0D)
       ICRNL    把CR(0D)映射成字符NR(0A)
    c_oflag: OPOST  输出后处理,如果不设置表示原始数据(本文使用原始数据) 
c_cc[VMIN]:  最少可读数据
c_cc[VTIME]: 等待数据时间(10秒的倍数)
如果以上的标志没有正确的屏蔽或设置,你的串口所收发的数据可能也不会正确,一定要注意这点

(三)由于串口设备经常在linux下使用,注意你要打开的终端设备名称是否正确,"/dev/ttys0"注意不要省略根目录符号,对于多串口通讯的芯片,注意打开的设备名称对应。

 

你可能感兴趣的:(Linux)