在Linux系统中,监听串口是嵌入式开发、设备通信、工业控制等场景中的常见需求,串口(Serial Port)作为一种异步通信接口,因其简单可靠、成本低廉等特点,至今仍被广泛应用,本文将详细介绍在Linux环境下监听串口的完整流程,包括串口配置、常用工具、编程实现及注意事项,帮助读者快速掌握这一技能。

串口基础知识
Linux将串口设备视为文件,通常位于/dev目录下,常见的设备名有/dev/ttyS0(COM1)、/dev/ttyS1(COM2)等,对于USB转串口设备,设备名可能为/dev/ttyUSB0、/dev/ttyACM0等,在监听串口之前,需要确认设备名是否存在,可通过ls /dev/tty*命令查看所有串口设备,串口通信涉及多个参数,包括波特率、数据位、停止位、校验位和流控,这些参数必须与通信设备保持一致才能正常通信。
使用命令行工具监听串口
Linux提供了多种命令行工具用于串口监听,适合快速调试和简单数据收发。
minicom
minicom是一款功能齐全的串口通信终端,支持拨号、文件传输等功能,安装后可通过以下命令配置并启动:
sudo minicom -s # 进入配置界面
在配置界面中选择“Serial port setup”,设置串口设备名、波特率(如9600)、数据位(8)、停止位(1)、校验位(None)等参数,保存后退出即可进入监听界面,使用Ctrl+A followed by X可退出minicom。
screen
screen是轻量级的终端复用工具,也可用于串口监听,直接执行以下命令:
screen /dev/ttyUSB0 9600
其中/dev/ttyUSB0为串口设备名,9600为波特率,退出时需先按下Ctrl+A followed by ,输入quit回车,screen的优势在于无需配置,适合临时监听。

cat与重定向
对于简单的数据读取,可直接使用cat命令结合重定向:
cat /dev/ttyUSB0
此方法会将串口数据实时输出到终端,但无法发送数据,且退出时需使用Ctrl+C中断进程。
使用Python监听串口
Python凭借丰富的库支持,成为串口编程的热门选择。pyserial是Python中最常用的串口通信库,可通过pip install pyserial安装。
基本监听代码
以下是一个简单的Python监听脚本,实现串口数据的实时读取:
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
print(f"串口 {ser.name} 已打开")
try:
    while True:
        if ser.in_waiting > 0:
            data = ser.readline().decode('utf-8').strip()
            if data:
                print(f"接收数据: {data}")
except KeyboardInterrupt:
    print("监听终止")
finally:
    ser.close()
代码中,serial.Serial()用于初始化串口,参数包括设备名、波特率和超时时间(单位:秒)。readline()读取一行数据,decode('utf-8')将字节转换为字符串。
高级功能
- 数据发送:使用
ser.write(b'Hello')发送字节数据。 - 配置参数:可通过
ser.baudrate、ser.bytesize等属性动态修改串口参数。 - 多线程监听:结合
threading模块实现数据发送和接收的并行处理,避免阻塞。 
使用C语言监听串口
对于高性能或底层开发场景,C语言是更优选择,Linux提供了termios库用于串口配置。

串口配置流程
串口配置主要包括以下步骤:
- 打开串口设备:
int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY)。 - 配置串口参数:通过
termios结构体设置波特率、数据位、停止位等。 - 应用配置:使用
tcsetattr(fd, TCSANOW, &newtio)。 - 读写数据:使用
read()和write()函数。 
示例代码片段
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
int main() {
    int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd < 0) {
        perror("打开串口失败");
        exit(1);
    }
    struct termios options;
    tcgetattr(fd, &options);
    cfsetispeed(&options, B9600);
    cfsetospeed(&options, B9600);
    options.c_cflag &= ~PARENB;   // 无校验
    options.c_cflag &= ~CSTOPB;   // 1位停止位
    options.c_cflag &= ~CSIZE;    // 数据位掩码
    options.c_cflag |= CS8;       // 8位数据位
    tcsetattr(fd, TCSANOW, &options);
    char buf[1024];
    while (1) {
        int n = read(fd, buf, sizeof(buf));
        if (n > 0) {
            buf[n] = '\0';
            printf("接收数据: %s\n", buf);
        }
    }
    close(fd);
    return 0;
}
编译时需链接termios库:gcc serial_test.c -o serial_test -lutil。
常见问题与解决方案
- 权限问题:普通用户可能无法访问串口设备,可通过
sudo usermod -aG dialout $USER将用户加入dialout组,或使用sudo chmod 666 /dev/ttyUSB0修改权限。 - 设备未识别:检查USB转串口驱动是否安装,可通过
lsusb查看设备信息,dmesg | grep tty查看内核日志。 - 数据乱码:确认波特率、数据位等参数与设备一致,检查信号线连接是否正确。
 - 监听卡顿:降低波特率或增加超时时间,避免数据缓冲区溢出。
 
串口参数配置表
| 参数 | 可选值 | 说明 | 
|---|---|---|
| 波特率 | 300, 1200, 9600, 19200, 115200等 | 数据传输速率 | 
| 数据位 | 5, 6, 7, 8 | 每帧数据包含的位数 | 
| 停止位 | 1, 1.5, 2 | 停止位长度 | 
| 校验位 | None, Even, Odd, Mark, Space | 数据校验方式 | 
| 流控 | None, Hardware, Software | 数据流控制机制 | 
Linux环境下监听串口可通过命令行工具(如minicom、screen)快速实现,也可通过编程语言(Python、C)进行定制化开发,无论是简单的数据查看还是复杂的通信协议实现,掌握串口监听技术都是嵌入式开发和设备交互的基础,在实际应用中,需根据具体需求选择合适的工具和方法,并注意参数配置和权限管理,确保通信稳定可靠。



















