You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:06:02