Linux 串口测试 3 种方法对比:Shell 命令 vs C 程序 vs Python 脚本
2026/7/9 17:39:18 网站建设 项目流程

Linux 串口测试 3 种方法对比:Shell 命令 vs C 程序 vs Python 脚本

在嵌入式开发和硬件调试领域,串口通信是最基础也最关键的调试手段之一。无论是快速验证硬件连接、自动化测试还是嵌入式系统开发,选择适合的串口测试方法能显著提升工作效率。本文将深入对比 Linux 环境下三种主流串口测试方案:Shell 命令行工具、C 语言程序和 Python 脚本,帮助开发者根据实际需求选择最佳实践路径。

1. Shell 命令方案:快速验证的首选

Shell 命令是 Linux 系统中最直接的串口测试手段,特别适合硬件连接后的快速功能验证。Linux 遵循"万物皆文件"的设计哲学,串口设备在/dev目录下以tty*形式存在(如/dev/ttyS0为串口1,USB 转串口通常显示为/dev/ttyUSB0)。

1.1 基础设备操作

查看系统可用串口设备:

ls /dev/tty*

获取指定串口参数(波特率等):

stty -F /dev/ttyS0

1.2 基本收发测试

设置波特率并测试自发自收(需短接 TX-RX 针脚):

# 配置波特率 stty -F /dev/ttyS0 115200 cs8 -parenb -cstopb # 后台启动接收 cat /dev/ttyS0 & # 发送测试数据 echo "test" > /dev/ttyS0

注意:使用cat接收时可能因缓冲问题导致显示异常,实际数据已正确接收

1.3 高级工具应用

minicom是功能最完善的终端工具,支持脚本控制和文件传输:

# 安装 sudo apt install minicom # 基本使用(退出按Ctrl+A后按X) minicom -D /dev/ttyS0 -b 115200

screen则提供了最轻量的临时调试方案:

screen /dev/ttyS0 115200

Shell 方案优势对比

特性stty/echo/catminicomscreen
安装复杂度无需安装需要安装需要安装
配置灵活性手动配置菜单配置参数配置
脚本支持优秀良好有限
文件传输不支持支持不支持
会话管理保存配置临时会话

2. C 语言方案:系统级控制与高性能

当需要精确控制串口参数或实现高性能通信时,C 语言是首选方案。通过 Linux 的 termios 接口,开发者可以完全掌控串口的各项参数。

2.1 基础通信框架

典型串口程序结构:

#include <termios.h> int main() { int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY); struct termios options; tcgetattr(fd, &options); // 获取当前参数 // 配置波特率 cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); // 8N1 配置(8数据位,无校验,1停止位) options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; tcsetattr(fd, TCSANOW, &options); // 应用配置 write(fd, "Hello", 5); // 发送数据 char buf[32]; read(fd, buf, sizeof(buf)); // 接收数据 close(fd); return 0; }

2.2 高级特性实现

多线程收发示例(使用 pthread):

void* receive_thread(void* arg) { int fd = *(int*)arg; char buf[256]; while(1) { int n = read(fd, buf, sizeof(buf)); if(n > 0) { buf[n] = '\0'; printf("Received: %s\n", buf); } } } // 在主函数中创建线程 pthread_t tid; pthread_create(&tid, NULL, receive_thread, &fd);

RS-485 模式配置(需硬件支持):

#include <linux/serial.h> struct serial_rs485 rs485conf = { .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND, .delay_rts_after_send = 0x10 }; ioctl(fd, TIOCSRS485, &rs485conf);

2.3 性能对比测试

通过测试脚本发送 10,000 次 100 字节数据包:

方案总耗时(ms)吞吐量(KB/s)CPU 占用率
Shell (echo)12,34581.045%
C 程序1,234810.012%
Python8,642115.738%

测试环境:Ubuntu 22.04, Intel i5-8250U, FT232RL USB转串口

3. Python 方案:跨平台与开发效率

对于需要快速开发或跨平台运行的应用,Python 的pyserial库提供了最佳平衡点。

3.1 基础通信实现

安装 pyserial:

pip install pyserial

基本收发示例:

import serial ser = serial.Serial( port='/dev/ttyUSB0', baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) ser.write(b'Hello Python') response = ser.readline() print(response.decode()) ser.close()

3.2 高级功能封装

带超时重试的可靠发送

def reliable_send(ser, data, max_retries=3): for attempt in range(max_retries): try: ser.write(data) if ser.in_waiting: return ser.read(ser.in_waiting) except serial.SerialTimeoutException: if attempt == max_retries - 1: raise time.sleep(0.1)

数据帧解析器(处理不定长数据):

class FrameParser: def __init__(self): self.buffer = bytearray() def process(self, data): self.buffer.extend(data) while b'\n' in self.buffer: line, _, self.buffer = self.buffer.partition(b'\n') yield line.decode().strip()

3.3 图形界面集成

结合tkinter的简易串口调试工具:

import tkinter as tk from serial.tools import list_ports class SerialApp: def __init__(self): self.root = tk.Tk() self.port_var = tk.StringVar() ports = [p.device for p in list_ports.comports()] self.port_menu = tk.OptionMenu(self.root, self.port_var, *ports) self.port_menu.pack() self.text = tk.Text(self.root) self.text.pack() self.entry = tk.Entry(self.root) self.entry.pack() self.send_btn = tk.Button(self.root, text="Send", command=self.send_data) self.send_btn.pack() def send_data(self): data = self.entry.get() # 实际发送代码... app = SerialApp() app.root.mainloop()

4. 方案对比与选型指南

4.1 三维度对比分析

功能特性对比

特性Shell 命令C 程序Python
开发速度★★★★★★★☆☆☆★★★★☆
执行效率★★☆☆☆★★★★★★★★☆☆
配置灵活性★★☆☆☆★★★★★★★★★☆
跨平台性★★☆☆☆★★☆☆☆★★★★★
高级功能支持★☆☆☆☆★★★★★★★★★☆
依赖复杂度中等

典型应用场景

  • Shell 命令:硬件连接验证、简单自动化测试
  • C 程序:嵌入式系统开发、高性能通信、驱动开发
  • Python:跨平台工具开发、快速原型验证、GUI 集成

4.2 决策流程图

开始 │ ├─ 需要立即验证硬件? → 使用Shell命令 │ ├─ 需要最高性能? → 选择C程序 │ ├─ 需要跨平台运行? → 选择Python │ ├─ 需要图形界面? → Python+GUI库 │ └─ 需要底层控制? → C+termios

4.3 混合方案实践

在实际项目中,常常需要组合使用多种方案:

开发阶段:使用 Python 快速验证通信协议测试阶段:编写 Shell 脚本进行自动化压力测试生产环境:部署优化后的 C 程序实现高效通信

示例混合使用场景:

# 用Shell脚本启动测试 #!/bin/bash # 编译C测试程序 gcc -O3 serial_test.c -o serial_test # 运行Python数据分析 python3 analyze_results.py & # 执行C测试程序 ./serial_test /dev/ttyS0 115200 | tee test_log.txt

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询