使用minicom时,如何通过两个终端并行访问Linux下的/dev/ttyACM0?
无需终止进程并行访问Linux串口设备的方法
串口设备默认是独占访问模式,当一个进程打开/dev/ttyACM0后,其他进程会被直接锁定。不用终止现有进程的话,有几种可行的解决方案:
1. 用socat做串口多路转发
这是最快捷的实现方式,通过中间套接字层让多个进程共享真实串口:
- 先在任意终端运行(不用关闭现有进程):
这条命令会把真实串口的数据流转发到一个全局可访问的UNIX套接字,socat /dev/ttyACM0,raw,echo=0 UNIX-LISTEN:/tmp/serial_shared.sock,mode=777mode=777确保其他用户进程也能连接。 - 之后其他终端就可以通过这个套接字访问串口,比如:
这会生成一个伪终端socat UNIX-CONNECT:/tmp/serial_shared.sock PTY,link=/dev/ttyV0,raw,echo=0/dev/ttyV0,你可以像操作真实串口一样使用它,所有数据都会通过socat自动转发到/dev/ttyACM0。
2. 自己写个简单的串口代理脚本
如果需要更灵活的控制(比如过滤数据、做读写同步),可以用Python快速写个代理脚本(需要提前安装pyserial库):
import serial import pty import os import threading # 打开真实串口,根据实际波特率调整参数 ser = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=1) # 创建伪终端 master_fd, slave_fd = pty.openpty() slave_path = os.ttyname(slave_fd) print(f"可用伪终端路径:{slave_path}") # 串口数据转伪终端 def serial_to_pty(): while True: data = ser.read(1024) if data: os.write(master_fd, data) # 伪终端数据转串口 def pty_to_serial(): while True: data = os.read(master_fd, 1024) if data: ser.write(data) # 启动双向转发线程 threading.Thread(target=serial_to_pty, daemon=True).start() threading.Thread(target=pty_to_serial, daemon=True).start() # 保持脚本运行 input("按回车停止代理...\n") ser.close() os.close(master_fd) os.close(slave_fd)
运行脚本后会输出伪终端路径,两个终端分别连接这个伪终端,就能共享访问真实串口了。
关键注意事项
- 并行访问串口存在数据冲突风险:两个进程同时写会导致输出乱码,读数据时会被两个进程拆分。如果必须并行,最好约定一个进程只读、一个只写,或者在应用层加同步逻辑。
- 如果原进程是你自己开发的,也可以修改代码,打开串口时使用
O_NONBLOCK标志或共享锁,但这种方式兼容性差,不如中间层转发可靠。
内容的提问来源于stack exchange,提问作者phani
相关产品推荐
相关产品推荐

