当前位置:首页 > 行业动态 > 正文

c串口通信程序linux

本文介绍了在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函数获取当前串口的属性,然后通过cfsetispeedcfsetospeed函数设置输入和输出波特率,通过修改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] = '
0