linux串口接收数据C语言代码
时间: 2024-11-02 18:08:57 浏览: 21
在Linux C语言中,可以使用POSIX标准库中的`fcntl()`和`select()`函数结合`termios`库来读取串口数据。这里有一个基本的例子:
```c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define SERIAL_PORT "/dev/ttyS0" // 替换为你的串口号
#define BAUDRATE 9600
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int fd; // 文件描述符
struct termios config;
// 打开串口
fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
perror("Error opening serial port");
return 1;
}
// 设置串口配置
tcgetattr(fd, &config); // 获取当前配置
cfsetispeed(&config, B9600); // 设置波特率
cfsetospeed(&config, B9600);
config.c_cflag &= ~CSIZE; // 清除填充位
config.c_cflag |= CS8; // 设置8位数据传输
config.c_lflag &= ~(ICANON | ECHO); // 关闭回显和行缓冲
config.c_iflag &= ~(IXON); // 禁止软件流控
config.c_oflag &= ~OPOST; // 关闭输出流控制
tcflush(fd, TCIFLUSH); // 渲染输入缓冲区为空
tcsetattr(fd, TCSANOW, &config); // 应用新配置
char buffer[BUFFER_SIZE];
ssize_t bytes_read;
while (true) { // 持续监听数据
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 500000; // 每隔半秒检查一次
if (select(fd + 1, &fds, NULL, NULL, &tv) > 0) { // 数据可用
bytes_read = read(fd, buffer, BUFFER_SIZE);
if (bytes_read > 0) {
printf("Received %zd bytes: %s\n", bytes_read, buffer);
} else if (bytes_read == 0) {
printf("Device disconnected.\n");
break;
} else {
perror("Error reading from serial port");
break;
}
}
}
close(fd); // 关闭串口
return 0;
}
```
注意:这个代码片段假设了硬件已经正确连接并且设备管理器已将它识别为 `/dev/ttyS0`。你需要根据实际情况修改。
阅读全文