linux下的串口收发通信 阻塞
时间: 2023-11-21 10:15:19 浏览: 133
在 Linux 下进行串口通信时,可以使用 POSIX 标准库提供的 termios 库来进行串口的配置和操作。
在进行串口通信时,通常会使用阻塞式 I/O 操作。即,当调用串口读取函数时,如果串口缓冲区中没有数据,函数会一直阻塞直到有数据到来或者超时。同样,当调用串口写入函数时,如果串口缓冲区已满,函数也会一直阻塞直到缓冲区有空间可以写入数据。
下面是一个使用阻塞式 I/O 进行串口通信的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
int main(void) {
int fd;
struct termios options;
// 打开串口设备文件,以读写方式打开
fd = open("/dev/ttyS0", O_RDWR);
if (fd < 0) {
perror("open");
exit(1);
}
// 获取并修改串口配置
tcgetattr(fd, &options);
cfmakeraw(&options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
tcsetattr(fd, TCSANOW, &options);
// 循环读写数据
while (1) {
char buf[100];
int len;
// 读取串口数据
len = read(fd, buf, sizeof(buf));
if (len < 0) {
perror("read");
exit(1);
}
printf("Received: %.*s\n", len, buf);
// 发送串口数据
strcpy(buf, "Hello, world!\n");
len = write(fd, buf, strlen(buf));
if (len < 0) {
perror("write");
exit(1);
}
printf("Sent: %.*s\n", len, buf);
sleep(1);
}
// 关闭串口设备文件
close(fd);
return 0;
}
```
在上面的代码中,我们使用阻塞式 I/O 进行串口通信。在循环中,我们先读取串口数据,然后发送一些数据。注意,在读取或写入数据时,我们使用了阻塞式 I/O 函数 read 和 write,它们会一直阻塞直到有数据到来或者缓冲区有空间可以写入数据。此外,我们在发送数据时,使用了 sleep 函数来进行延时,以便让数据能够被接收方处理。
阅读全文