将串行 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,因此每次调用只会尝试读取一个字节。
我为嵌入式设备实现了一个串行协议并调试了我在主机 [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,因此每次调用只会尝试读取一个字节。