Page 1 of 1

串口读取问题

Posted: 2024-06-14 10:07
by bdzx_xb
如果直接read,有没有数据都会返回。

如果用select异步,
ret = select( m_serial_fd+1,&fdRead,NULL,NULL,&aTime );
没有新的数据也会返回

而用其它的串口工具直接连设备读取就没这个问题

有没有好的方法只有串口有数据到才处理

Re: 串口读取问题

Posted: 2024-07-31 7:52
by Crocodile
您好,很抱歉时间过得有点久了,我这边测select串口有数据才处理是没有问题的,这是相关测试代码,可以进行参考
串口设置

Code: Select all

    struct termios options;
    tcgetattr(serial_fd, &options);
    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CRTSCTS;
    tcsetattr(serial_fd, TCSANOW, &options);
select 处理

Code: Select all

       ret = select( m_serial_fd+1,&fdRead,NULL,NULL,&aTime );

        if (ret == -1) {
            perror("select 失败");
            close(m_serial_fd);
            return 1;
        } else if (ret) {
            if (FD_ISSET(m_serial_fd, &fdRead)) {
                char buf[256];
                int bytes_read = read(m_serial_fd, buf, sizeof(buf) - 1);
                if (bytes_read > 0) {
                    buf[bytes_read] = '\0';
                    printf("get Data: %s\n", buf);
                }
            }
        }