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); // 本人代码增加这个配置即可正常读取数据
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值