如何用Python模拟USB串口设备 满足/dev/serial路径及list_ports识别要求
Linux下模拟可被标准串口工具识别的USB串口设备方案
pyserial本身无法直接生成内核层面的串口设备节点,需要结合Linux系统的虚拟串口驱动实现,以下方案可完全满足你的两个要求:
步骤1:安装并加载tty0tty虚拟串口驱动
tty0tty是Linux下的 null modem 虚拟串口驱动,会生成一对配对的串口设备,往其中一个写入的数据可以从另一个读出:
- Debian/Ubuntu 系统直接安装:
sudo apt install tty0tty - 手动加载驱动:
sudo modprobe tty0tty
加载完成后默认会生成/dev/tnt0、/dev/tnt1两个配对的虚拟串口设备。
步骤2:创建指定路径的串口映射
首先创建/dev/serial目录(如果不存在):
sudo mkdir -p /dev/serial
创建软链接映射到虚拟串口,满足路径访问要求:
# 要求1:映射到/dev/serial/file路径 sudo ln -s /dev/tnt0 /dev/serial/file # 如果需要生成by-id路径下的对应文件,直接对应创建软链接即可 sudo mkdir -p /dev/serial/by-id sudo ln -s /dev/tnt0 /dev/serial/by-id/usb-Simulated_Sensor_12345-if00-port0
给虚拟串口赋予读写权限,避免权限访问错误:
sudo chmod 666 /dev/tnt0 /dev/tnt1
步骤3:验证串口识别能力
此时虚拟串口已经可以被serial.tools.list_ports接口正常识别,验证代码如下:
import serial.tools.list_ports ports = [p.device for p in serial.tools.list_ports.comports()] print("/dev/tnt0" in ports) # 输出为True代表识别正常
步骤4:编写模拟传感器的Python脚本
使用配对的另一个虚拟串口/dev/tnt1作为写入端,持续发送模拟的传感器字节数据即可:
import serial import time # 配置串口参数,和目标软件的串口参数保持一致即可 write_ser = serial.Serial( port="/dev/tnt1", baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) while True: # 替换为实际传感器的输出字节 mock_sensor_data = b"\x01\x02\x03\x04\x05\x06\x07\x08" write_ser.write(mock_sensor_data) # 调整发送频率匹配实际需求 time.sleep(0.5)
运行脚本后,目标软件直接读取/dev/serial/file或者对应by-id路径下的设备,即可正常收到模拟的传感器数据。
补充说明
- 系统重启后驱动会自动卸载,软链接也会消失,可以将加载驱动、创建软链接、设置权限的命令写入
/etc/rc.local或者systemd自启服务,实现开机自动配置。 - 虚拟串口的波特率、校验位等参数仅做形式兼容,不需要和实际硬件完全一致,只要模拟脚本和目标软件配置统一即可正常通信。
内容的提问来源于stack exchange,提问作者Nilesh Hampiholi
相关产品推荐
相关产品推荐

