gpt4 book ai didi

python - 将串行链接的输入和输出转发到其他进程的标准输入和标准输出

转载 作者:行者123 更新时间:2023-12-05 07:53:07 25 4
gpt4 key购买 nike

我为嵌入式设备实现了一个串行协议(protocol)并调试了我在主机 [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 对象。当我将问题减少到仅将数据从串行链接转发到 Popen 对象时,它按预期工作

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

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

#forward_to_serial()

有没有办法让它工作?

最佳答案

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

您应该尽可能多地阅读操作系统在任何时候给您的内容,例如与 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,因此每次调用只会尝试读取一个字节。

关于python - 将串行链接的输入和输出转发到其他进程的标准输入和标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33102589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com