上一篇
c串口通信程序linux
- 行业动态
- 2025-01-30
- 10
本文介绍了在Linux下使用C语言实现串口通信的程序,包括串口通信的基本知识、struct termios结构体及其相关函数(如tcsetattr()、tcgetattr()、cfsetispeed()和cfsetospeed()),以及如何封装串口的打开、关闭、数据发送和接收函数等。
在Linux环境下使用C语言编写串口通信程序,主要涉及打开串口设备、配置串口参数以及进行数据的读写操作,以下是详细的步骤和示例代码:
包含头文件
需要包含以下头文件来提供对终端控制台和串口操作的访问:
include <stdio.h> include <fcntl.h> include <termios.h> include <unistd.h> include <string.h> include <errno.h>
打开串口设备
使用open
函数打开串口设备文件,通常串口设备位于/dev
目录下,如/dev/ttyUSB0
等,以读写方式打开,并设置适当的标志位,如O_RDWR
表示可读写,O_NOCTTY
表示不将该设备作为控制终端,O_NDELAY
表示非阻塞模式。
int open_serial_port(const char *port_name, int baud_rate) { int fd = open(port_name, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("Error opening serial port"); return -1; } return fd; }
配置串口参数
获取并修改串口的属性,包括波特率、数据位、停止位、校验位等,首先使用tcgetattr
函数获取当前串口的属性,然后通过cfsetispeed
和cfsetospeed
函数设置输入和输出波特率,通过修改termios
结构体的其他成员来设置其他参数。
int configure_serial_port(int fd, int baud_rate) { struct termios options; memset(&options, 0, sizeof(options)); if (tcgetattr(fd, &options) != 0) { perror("tcgetattr"); return -1; } cfsetispeed(&options, baud_rate); cfsetospeed(&options, baud_rate); options.c_cflag &= ~PARENB; // 禁用奇偶校验 options.c_cflag &= ~CSTOPB; // 设置停止位为1 options.c_cflag &= ~CSIZE; // 清除数据位标志 options.c_cflag |= CS8; // 设置为8位数据 options.c_cflag &= ~CRTSCTS; // 禁用硬件流控 options.c_cflag |= CREAD | CLOCAL; // 启用接收器,本地连接 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 设置输入模式 options.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用软件流控 options.c_oflag &= ~OPOST; // 设置输出模式 options.c_cc[VMIN] = 1; // 读取一个字符 options.c_cc[VTIME] = 0; // 无超时 if (tcsetattr(fd, TCSANOW, &options) != 0) { perror("tcsetattr"); return -1; } tcflush(fd, TCIFLUSH); // 刷新输入缓冲区 return 0; }
读写数据
使用write
函数向串口写入数据,使用read
函数从串口读取数据,可以将这些操作封装成函数,以提高代码的复用性。
ssize_t port_write(int port_fd, const unsigned char* data, size_t length) { return write(port_fd, data, length); } ssize_t port_read(int port_fd, unsigned char* buffer, size_t length) { return read(port_fd, buffer, length); }
完整的示例程序
以下是一个完整的示例程序,展示了如何在Linux下使用C语言实现串口通信的基本流程:
include <stdio.h> include <stdlib.h> include <fcntl.h> include <unistd.h> include <termios.h> include <string.h> include <errno.h> define SERIAL_PORT "/dev/ttyUSB0" // 这里替换为你设备的实际路径 define BAUD_RATE B9600 define CHAR_SIZE CS8 int open_serial_port(const char *port_name, int baud_rate); int configure_serial_port(int fd, int baud_rate); ssize_t port_write(int port_fd, const unsigned char* data, size_t length); ssize_t port_read(int port_fd, unsigned char* buffer, size_t length); int main() { int fd = open_serial_port(SERIAL_PORT, BAUD_RATE); if (fd < 0) { return 1; } if (configure_serial_port(fd, BAUD_RATE) < 0) { close(fd); return 1; } const char *message = "Hello, Serial Port!"; port_write(fd, (const unsigned char *)message, strlen(message)); unsigned char buffer[256]; ssize_t bytes_read = port_read(fd, buffer, sizeof(buffer) 1); if (bytes_read > 0) { buffer[bytes_read] = '