您的位置:首页 > 教育 > 锐评 > Linux 嵌入式设备 读取串口数据 /dev/ttyS2 数据丢失 数据读取异常

Linux 嵌入式设备 读取串口数据 /dev/ttyS2 数据丢失 数据读取异常

2024/10/6 8:23:30 来源:https://blog.csdn.net/m0_37932636/article/details/140987935  浏览:    关键词:Linux 嵌入式设备 读取串口数据 /dev/ttyS2 数据丢失 数据读取异常

近期在工作中,需要读取指定设备往主板上发送的串口数据,遇到一个很奇怪的问题,同样的程序,通过USB转TTL 连接到电脑上可以正常显示,

但是在主板上,特殊的字符,0x0D 会变成0x0A, 0x11,0x13这2个字节会直接丢失,导致数据校验不通过,经过多方查找资料,明确了其原因,就是终端对特殊字符处理的问题

附解决办法

    int fd;struct termios tty;// 打开串口设备fd = open(SERIAL_PATH, O_RDWR | O_NOCTTY | O_NDELAY);LOG("%s" ,SERIAL_PATH);if (fd == -1) {perror("无法打开串口");return -1;}// 获取当前串口设置if (tcgetattr(fd, &tty) != 0) {perror("tcgetattr 错误");close(fd);return -1;}// 设置波特率cfsetispeed(&tty, B9600);cfsetospeed(&tty, B9600);// 设置数据位、校验位和停止位tty.c_cflag &= ~PARENB;  // 无校验位tty.c_cflag &= ~CSTOPB;  // 1位停止位tty.c_cflag &= ~CSIZE;   // 清除数据位设置tty.c_cflag |= CS8;      // 8位数据位// 设置为原始模式tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);tty.c_oflag &= ~OPOST;tty.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);// 设置读取超时tty.c_cc[VMIN] = 0;  // 读取至少0个字符tty.c_cc[VTIME] = 5;// 应用新的串口设置if (tcsetattr(fd, TCSANOW, &tty) != 0) {perror("tcsetattr 错误");close(fd);return -1;}

修改的核心是:

    // 设置为原始模式tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);tty.c_oflag &= ~OPOST;tty.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); // 本人代码增加这个配置即可正常读取数据

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com