近期在工作中,需要读取指定设备往主板上发送的串口数据,遇到一个很奇怪的问题,同样的程序,通过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); // 本人代码增加这个配置即可正常读取数据