如何通过软件实现让一个进程监听另一个进程正在写入的串口
如何通过软件实现让一个进程监听另一个进程正在写入的串口
嘿,这个需求我太懂了——不用折腾USB线或者硬件,纯软件就能搞定!咱们可以用虚拟串口对来解决你的问题,Ubuntu上有现成的工具,几步就能搭好环境,完美解决你说的两个痛点:没有物理设备时串口不存在、写进程占用端口后读进程无法访问的问题。
下面给你两种实用的方法,按需选就行:
方法一:用socat快速创建虚拟串口对(推荐,无需编译)
socat是个功能强大的工具,能轻松造出虚拟的串口端点,步骤超简单:
- 先安装socat:
sudo apt update && sudo apt install socat - 运行命令创建虚拟串口对:
执行后终端会输出类似这样的内容:sudo socat -d -d pty,raw,echo=0 pty,raw,echo=02024/05/20 10:00:00 socat[1234] N PTY is /dev/pts/3
2024/05/20 10:00:00 socat[1234] N PTY is /dev/pts/4
2024/05/20 10:00:00 socat[1234] N starting data transfer loop with FDs [5,5] and [7,7]
这里的/dev/pts/3和/dev/pts/4就是一对互连的虚拟串口,一个写,另一个就能读。 - 现在你的bash进程可以往其中一个串口写数据,比如:
同时用Python进程打开另一个串口读取,示例代码大概是这样:echo "Hello from bash!" > /dev/pts/3import serial ser = serial.Serial('/dev/pts/4', baudrate=9600, timeout=1) while True: data = ser.readline() if data: print(f"Received: {data.decode().strip()}") - 如果想让socat后台运行(关闭终端也不消失),可以用nohup:
sudo nohup socat -d -d pty,raw,echo=0 pty,raw,echo=0 > /dev/null 2>&1 &
方法二:用tty0tty模拟真实串口(适合需要更接近物理串口场景)
如果你需要更像真实串口的虚拟设备,可以用tty0tty内核模块:
- 下载tty0tty的源码包并解压,进入模块目录编译:
cd tty0tty/module make - 加载编译好的内核模块:
sudo insmod tty0tty.ko - 创建虚拟串口设备节点:
想要多对串口的话,继续创建sudo mknod /dev/ttyV0 c 240 0 sudo mknod /dev/ttyV1 c 240 1ttyV2/ttyV3(主设备号都是240,次设备号依次加2)就行。 - 设置权限让普通用户能访问:
sudo chmod 666 /dev/ttyV* - 现在你可以让bash进程写
/dev/ttyV0,Python进程读/dev/ttyV1,完全和物理串口一样的使用体验。
注意事项
- 用tty0tty的话,重启系统后内核模块会被卸载,需要重新执行
insmod和创建设备节点的命令,你可以把这些命令加到开机脚本(比如/etc/rc.local)或者创建一个systemd服务来自动加载。 - Python读取串口时,要确保波特率、奇偶校验等参数和写入端一致,不过虚拟串口用
raw模式的话,很多参数可以忽略,影响不大。
备注:内容来源于stack exchange,提问作者OZ1SEJ




