Linux 串口编程:解决read阻塞问题,实现非阻塞读取
问题可能是由于 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 发送的数据。
原文地址: https://www.cveoy.top/t/topic/o3Yq 著作权归作者所有。请勿转载和采集!