问题可能是由于 read 函数在没有数据可读时会阻塞,直到有数据可读为止。当你通过 write 函数往串口发送数据时,会触发串口接收数据的事件,从而使 read 函数解除阻塞并读取到数据。

解决这个问题的方法是在读取串口数据之前,先设置串口的阻塞模式为非阻塞模式。可以使用以下代码片段来设置串口的阻塞模式:

#include <fcntl.h>
#include <termios.h>

int set_nonblocking(int fd) {
    int flags;
    
    flags = fcntl(fd, F_GETFL, 0);
    if (flags == -1) {
        return -1;
    }
    
    flags |= O_NONBLOCK;
    if (fcntl(fd, F_SETFL, flags) == -1) {
        return -1;
    }
    
    return 0;
}

在打开串口后,调用 set_nonblocking 函数将串口的阻塞模式设置为非阻塞模式。这样,当没有数据可读时,read 函数会立即返回,并不会阻塞程序的执行。你可以在循环中不断地调用 read 函数来读取串口数据,当 read 函数返回 -1 时表示没有数据可读。

int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
 if (fd == -1) {
    // 处理打开串口失败的情况
 }

 // 设置串口为非阻塞模式
 if (set_nonblocking(fd) == -1) {
    // 处理设置串口非阻塞模式失败的情况
 }

 while (1) {
    char buffer[1024];
    ssize_t n_bytes = read(fd, buffer, sizeof(buffer));
    
    if (n_bytes == -1) {
        // 处理读取串口数据失败的情况
    } else if (n_bytes == 0) {
        // 没有数据可读,继续循环
        continue;
    }
    
    // 处理读取到的串口数据
    // ...
 }

通过以上方式设置串口为非阻塞模式,你将能够在没有数据可读时立即返回,并且能够读取到通过 write 发送的数据。

Linux 串口编程:解决read阻塞问题,实现非阻塞读取

原文地址: https://www.cveoy.top/t/topic/o3Yq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录