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

如何为真实串口设备创建虚拟设备以支持多进程读写?

如何为真实串口设备创建虚拟设备以支持多进程读写?

看起来你踩了个典型的串口共享坑——串口设备默认是独占访问的,你之前直接用两个socat实例把虚拟PTY分别绑定到/dev/ttyUSB0,相当于两个进程同时抢着用真实串口,通信数据直接乱掉了,难怪程序收不到响应。下面给你一个靠谱的解决思路和具体操作步骤:

核心思路:用中间套接字做多路转发

咱们需要先把真实串口转成一个可共享的UNIX套接字,再让多个虚拟PTY连接到这个套接字,由socat负责把多个虚拟设备的请求统一转发到真实串口,再把响应分发给对应的进程。

具体操作步骤

  1. 第一步:启动串口-套接字转发服务
    先运行这条命令,把真实串口/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:重启命令时不会因为套接字占用报错
  1. 第二步:创建多个虚拟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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:28:07