美文网首页物联网loT从业者
解决方法:Linux串口接收字节0x11,0x0d,0x13丢失

解决方法:Linux串口接收字节0x11,0x0d,0x13丢失

作者: Leung_ManWah | 来源:发表于2019-08-28 08:55 被阅读0次

    一、背景

    串口发送:
    read 44 byte: 5a a5 07 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    串口接收:
    read 43 byte: 5a a5 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    UART串口发送44字节数据,但实际接收只有43字节,发现0x13丢失了

    二、原因

    网上许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉。
    0x0d 回车符CR
    0x11 ^Q VSTART字符
    0x13 ^S VSTOP字符
    被用作特殊控制了,关掉 ICRNLIXON 选项即可解决。

    在《UNIX环境高级编程第二版》第18章第11小节看到把终端I/O设置为原始模式(串口通讯就是终端I/O的原始模式)时输入属性设置为
    term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

    三、解决方法

    修改为:c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

    四、附录

    表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 当输入队列满的时候开始响铃

    表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

    表3 c_cflag参数

    键 值 说 明
    CBAUD 波特率(4+1位)(非POSIX)
    CBAUDEX 附加波特率(1位)(非POSIX)
    CSIZE 字符长度,取值范围为CS5、CS6、CS7或CS8
    CSTOPB 设置两个停止位
    CREAD 使用接收器
    PARENB 使用奇偶校验
    PARODD 对输入使用奇偶校验,对输出使用偶校验
    HUPCL 关闭设备时挂起
    CLOCAL 忽略调制解调器线路状态
    CRTSCTS 使用RTS/CTS流控制

    表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信号

    表5 c_cc支持的控制字符

    说 明
    VINTR Interrupt字符
    VQUIT Quit字符
    VERASE Erase字符
    VKILL Kill字符
    VEOF End-of-file字符
    VMIN 非规范模式读取时的最小字符数
    VEOL 附加的End-of-file字符
    VTIME 非规范模式读取时的超时时间
    VSTOP Stop字符
    VSTART Start字符
    VSUSP Suspend字符

    • 由 Leung 写于 2019 年 8 月 28 日

    • 参考:linux 串口接收不到0x11, 0x0d, 0x13

    相关文章

      网友评论

        本文标题:解决方法:Linux串口接收字节0x11,0x0d,0x13丢失

        本文链接:https://www.haomeiwen.com/subject/ycqyectx.html