如何为真实串口设备创建虚拟设备以支持多进程读写?
如何为真实串口设备创建虚拟设备以支持多进程读写?
看起来你踩了个典型的串口共享坑——串口设备默认是独占访问的,你之前直接用两个socat实例把虚拟PTY分别绑定到/dev/ttyUSB0,相当于两个进程同时抢着用真实串口,通信数据直接乱掉了,难怪程序收不到响应。下面给你一个靠谱的解决思路和具体操作步骤:
核心思路:用中间套接字做多路转发
咱们需要先把真实串口转成一个可共享的UNIX套接字,再让多个虚拟PTY连接到这个套接字,由socat负责把多个虚拟设备的请求统一转发到真实串口,再把响应分发给对应的进程。
具体操作步骤
- 第一步:启动串口-套接字转发服务
先运行这条命令,把真实串口/dev/ttyUSB0和一个UNIX套接字绑定,作为中间转发节点:
socat -d -d /dev/ttyUSB0,raw,echo=0,nonblock,b9600,cs8,cstopb=1,parenb=0 UNIX-LISTEN:/tmp/modbus_serial.sock,mode=777,reuseaddr
- 参数说明:
b9600,cs8,cstopb=1,parenb=0:替换成你Modbus设备实际的波特率、数据位、停止位、奇偶校验参数,必须和设备一致!nonblock:让套接字支持非阻塞模式,适配多连接场景mode=777:确保其他进程能访问这个套接字reuseaddr:重启命令时不会因为套接字占用报错
- 第二步:创建多个虚拟PTY连接到套接字
打开新的终端窗口,分别运行以下命令,创建两个虚拟串口设备:
# 第一个虚拟设备 socat -d -d pty,raw,echo=0,link=/dev/ttyUSB0-1,b9600,cs8,cstopb=1,parenb=0 UNIX-CONNECT:/tmp/modbus_serial.sock # 第二个虚拟设备 socat -d -d pty,raw,echo=0,link=/dev/ttyUSB0-2,b9600,cs8,cstopb=1,parenb=0 UNIX-CONNECT:/tmp/modbus_serial.sock
现在你的两个进程就可以分别用/dev/ttyUSB0-1和/dev/ttyUSB0-2,它们的读写请求都会通过中间套接字转发到真实的/dev/ttyUSB0,响应也会正确返回给对应的进程。
额外注意事项
- 一定要确保所有
socat实例和你的应用程序使用的串口参数(波特率、校验位等)完全一致,否则通信会失败。 - 如果遇到权限问题,可能需要用
sudo运行socat,或者给/dev/ttyUSB0添加用户组权限(比如把用户加入dialout组)。
备注:内容来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

