You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过软件实现让一个进程监听另一个进程正在写入的串口

如何通过软件实现让一个进程监听另一个进程正在写入的串口

嘿,这个需求我太懂了——不用折腾USB线或者硬件,纯软件就能搞定!咱们可以用虚拟串口对来解决你的问题,Ubuntu上有现成的工具,几步就能搭好环境,完美解决你说的两个痛点:没有物理设备时串口不存在、写进程占用端口后读进程无法访问的问题。

下面给你两种实用的方法,按需选就行:

方法一:用socat快速创建虚拟串口对(推荐,无需编译)

socat是个功能强大的工具,能轻松造出虚拟的串口端点,步骤超简单:

  1. 先安装socat:
    sudo apt update && sudo apt install socat
    
  2. 运行命令创建虚拟串口对:
    sudo socat -d -d pty,raw,echo=0 pty,raw,echo=0
    
    执行后终端会输出类似这样的内容:

    2024/05/20 10:00:00 socat[1234] N PTY is /dev/pts/3
    2024/05/20 10:00:00 socat[1234] N PTY is /dev/pts/4
    2024/05/20 10:00:00 socat[1234] N starting data transfer loop with FDs [5,5] and [7,7]
    这里的/dev/pts/3/dev/pts/4就是一对互连的虚拟串口,一个写,另一个就能读。

  3. 现在你的bash进程可以往其中一个串口写数据,比如:
    echo "Hello from bash!" > /dev/pts/3
    
    同时用Python进程打开另一个串口读取,示例代码大概是这样:
    import serial
    
    ser = serial.Serial('/dev/pts/4', baudrate=9600, timeout=1)
    while True:
        data = ser.readline()
        if data:
            print(f"Received: {data.decode().strip()}")
    
  4. 如果想让socat后台运行(关闭终端也不消失),可以用nohup:
    sudo nohup socat -d -d pty,raw,echo=0 pty,raw,echo=0 > /dev/null 2>&1 &
    

方法二:用tty0tty模拟真实串口(适合需要更接近物理串口场景)

如果你需要更像真实串口的虚拟设备,可以用tty0tty内核模块:

  1. 下载tty0tty的源码包并解压,进入模块目录编译:
    cd tty0tty/module
    make
    
  2. 加载编译好的内核模块:
    sudo insmod tty0tty.ko
    
  3. 创建虚拟串口设备节点:
    sudo mknod /dev/ttyV0 c 240 0
    sudo mknod /dev/ttyV1 c 240 1
    
    想要多对串口的话,继续创建ttyV2/ttyV3(主设备号都是240,次设备号依次加2)就行。
  4. 设置权限让普通用户能访问:
    sudo chmod 666 /dev/ttyV*
    
  5. 现在你可以让bash进程写/dev/ttyV0,Python进程读/dev/ttyV1,完全和物理串口一样的使用体验。

注意事项

  • 用tty0tty的话,重启系统后内核模块会被卸载,需要重新执行insmod和创建设备节点的命令,你可以把这些命令加到开机脚本(比如/etc/rc.local)或者创建一个systemd服务来自动加载。
  • Python读取串口时,要确保波特率、奇偶校验等参数和写入端一致,不过虚拟串口用raw模式的话,很多参数可以忽略,影响不大。

备注:内容来源于stack exchange,提问作者OZ1SEJ

火山引擎 最新活动