如何在Linux系统中进行串口通信编程?

在 Linux 中,可以使用 /dev/ttySx (/dev/ttyS1) 设备文件来访问串行端口。通过命令 stty 配置波特率、数据位等参数,然后使用 echocat 命令进行数据传输。

在Linux系统中,串口通信是一个常见的任务,尤其在嵌入式系统和硬件调试中,串口(Serial Port)是计算机上用于串行通信的端口,通常用于连接外部设备如传感器、GPS模块、条码扫描器等,本文将详细介绍如何在Linux系统中进行串口编程,包括打开串口、配置串口参数、读写数据以及关闭串口的步骤。

打开串口

linux写串口

在Linux中,串口设备通常被表示为/dev/ttyS/dev/serial/by-id/,第一个串口通常是/dev/ttyS0/dev/serial/by-id/usb-FTDI_FT232R-if00-port0

使用C语言中的open()函数可以打开串口:

int serial_port = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC);
if (serial_port < 0) {
    perror("Error opening serial port");
    return -1;
}

配置串口参数

使用termios结构体来配置串口参数,包括波特率、字符大小、停止位、校验位等。

struct termios tty;
memset(&tty, 0, sizeof(tty));
// 获取当前串口配置
if (tcgetattr(serial_port, &tty) != 0) {
    perror("Error from tcgetattr");
    return -1;
}
// 设置波特率为9600
cfsetospeed(&tty, B9600);
cfsetispeed(&tty, B9600);
// 设置8N1模式(8个数据位,无校验位,1个停止位)
tty.c_cflag &= ~PARENB; // 清除奇偶校验位
tty.c_cflag &= ~CSTOPB; // 设置为1个停止位
tty.c_cflag &= ~CSIZE; // 清除数据位设置
tty.c_cflag |= CS8; // 设置为8个数据位
// 应用配置
if (tcsetattr(serial_port, TCSANOW, &tty) != 0) {
    perror("Error from tcsetattr");
    return -1;
}

读写数据

使用read()write()函数进行数据的读取和写入。

// 写数据到串口
const char *data = "Hello, serial port!";
int len = write(serial_port, data, strlen(data));
if (len < 0) {
    perror("Error writing to serial port");
    return -1;
}
// 从串口读取数据
char read_buf[100];
memset(read_buf, '