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

使用minicom时,如何通过两个终端并行访问Linux下的/dev/ttyACM0?

无需终止进程并行访问Linux串口设备的方法

串口设备默认是独占访问模式,当一个进程打开/dev/ttyACM0后,其他进程会被直接锁定。不用终止现有进程的话,有几种可行的解决方案:

1. 用socat做串口多路转发

这是最快捷的实现方式,通过中间套接字层让多个进程共享真实串口:

  • 先在任意终端运行(不用关闭现有进程):
    socat /dev/ttyACM0,raw,echo=0 UNIX-LISTEN:/tmp/serial_shared.sock,mode=777
    
    这条命令会把真实串口的数据流转发到一个全局可访问的UNIX套接字,mode=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:20:26