将串行 link 的输入和输出转发到其他进程的标准输入和标准输出

Forwarding the in and output of a serial link to the stdin and stdout of an other process

我为嵌入式设备实现了一个串行协议并调试了我在主机 [Widows 7 MinGW] 上编译的代码,只是使用标准输入和标准输出进行通信,现在我想将它连接到控制软件使用虚拟零调制解调器电缆。

我认为编写一个 python3 脚本并不难到标准输入但是,我无法得到它 运行。这是我最好的尝试 [我用 cat 替换了我的可执行文件]:

import subprocess
import serial
import threading

def forward_to_serial():
    while True:
        ser.write(proc.stdout.read())

def forward_to_cmd():
    while True:
        proc.stdin.write(ser.read())
        proc.stdin.flush()

ser = serial.Serial('COM27', timeout = 100)

proc = subprocess.Popen("cat", stdout=subprocess.PIPE, stdin=subprocess.PIPE)

fwc = threading.Thread(target = forward_to_cmd)
fwc.start()

forward_to_serial()

它不起作用可能是由于两个活动线程访问 Popen 对象。当我将问题减少到仅将数据从串行 link 转发到 Popen 对象时,它按预期工作

proc = subprocess.Popen("cat", stdin=subprocess.PIPE)

fwc = threading.Thread(target = forward_to_cmd)
fwc.start()

#forward_to_serial()

有没有办法让它工作?

read() method,当它的参数被省略时,阻塞直到它从流中读取了 all 数据,直到子进程退出才会发生.

您应该尽可能多地阅读 OS 随时给您的内容,例如与 read1() method。这样,如果您得到部分读取(因为子进程写入或用户在未关闭流的情况下键入了一些数据),您可以立即转发它,而不是将其缓冲在内存中并等待流关闭。例如:

MAX_READ_SIZE = 4096
def forward_to_serial():
    while True:
        data = proc.stdout.read1(MAX_READ_SIZE)
        if not data:
            break  # EOF
        ser.write(data)

请注意,在forward_to_cmd()的情况下,从串口读取时,serial.read()确实具有相同的阻塞直到EOF的行为如果参数被省略。相反,它默认为 1,因此每次调用只会尝试读取一个字节。