Linux Kubuntu14系统下已被占用的/dev/ttyS0串口能否被嗅探
串口多进程同时监听问题解答
问题原因
Linux下串口属于字符设备,默认无内核层面的流量复制机制,多个进程同时读取同一个串口设备时,内核会将串口收到的字节流按进程调度顺序分发给不同的读进程,所以会出现你观察到的消息被拆分、两个进程各拿到部分数据的情况,这是串口的默认读写逻辑,不是工具故障。
可行解决方案
可以实现应用和嗅探工具同时拿到完整串口数据,推荐两种低改造成本的方案:
方案1:ttybus 串口多路复用
这是最适配串口监听场景的方案,原理是让ttybus独占真实串口,虚拟出多个完全一致的伪串口,所有真实串口的出入流量都会被复制后分发给所有连接伪串口的进程,不会出现流量拆分。
操作步骤:
- 安装ttybus:
sudo apt install ttybus(Kubuntu 14官方源已经包含该工具) - 启动ttybus绑定真实串口,按需生成对应数量的伪串口,示例生成2个伪串口:
ttybus /dev/ttyS0 /tmp/ttyApp /tmp/ttySniffer - 修改你的应用串口配置,改为连接
/tmp/ttyApp,jpnevulator改为监听/tmp/ttySniffer即可,两个进程都能拿到完整的串口数据
方案2:socat 流量镜像
如果不想修改现有应用的串口连接配置,可以用socat做流量复制:
- 先停止占用/dev/ttyS0的应用,执行socat命令:
socat /dev/ttyS0,raw,b9600,parenb=0 SYSTEM:'tee /tmp/serialFull.log | socat - PTY,link=/tmp/ttyApp,raw,b9600,parenb=0' &
注意把上述命令里的b9600、parenb=0等参数替换成你实际用到的串口波特率、奇偶校验等配置 - 你的应用正常连接
/dev/ttyS0即可,全量串口流量会同步写入/tmp/serialFull.log,你也可以用jpnevulator直接监听该日志文件,或者监听/tmp/ttyApp伪串口获取完整流量
注意事项
两种方案都需要先释放真实串口/dev/ttyS0的占用,让复用工具先绑定真实串口,再启动业务应用和嗅探工具,否则还是会出现流量争抢的问题。
内容的提问来源于stack exchange,提问作者y8natan
相关产品推荐
相关产品推荐

