linux int UartBlockRead (int fd, char *rbuf)以阻塞的方式打开串口,并设置为5s的超时返回,然后从串口中读取数据,并返回读取数据的长度。
时间: 2024-02-16 16:03:12 浏览: 63
好的,根据您的要求,我为您提供以下 C 语言代码实现 `UartBlockRead` 函数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <string.h>
#include <errno.h>
int UartBlockRead(int fd, char *rbuf) {
struct termios options;
// 配置串口
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
// 设置阻塞方式和超时时间
fcntl(fd, F_SETFL, 0);
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 50; // 5s超时
tcsetattr(fd, TCSANOW, &options);
// 读取数据
int n = read(fd, rbuf, sizeof(rbuf));
if (n < 0) {
perror("read");
return -1;
}
return n;
}
```
请注意,上述代码中的超时时间单位为 0.1 秒,即 VTIME = 50 对应 5 秒超时。另外,该函数中的 `fd` 参数为打开的串口文件描述符,`rbuf` 参数为存放读取数据的缓冲区,函数返回值为读取到的字节数,如果读取失败则返回 -1。
阅读全文