[英]Forwarding the in and output of a serial link to the stdin and stdout of an other process
我為嵌入式設備實現了串行協議,並使用stdin和stdout進行通訊以調試在主機[Widows 7 MinGW]上編譯的代碼,現在我想使用虛擬的空調制解調器將其連接到控制軟件電纜。
我認為編寫一個python3腳本確實很困難,該腳本可以將程序的stdout並轉發到串行鏈接,同時將數據以串行方式發送到stdin,但我無法使其運行。 這是我的最佳嘗試[我將可執行文件替換為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()
方法 (如果省略其參數)將阻塞,直到從流中讀取了所有數據為止,直到子進程退出時才發生。
相反,您應該在任何時候都閱讀OS會給您的內容,例如使用read1()
方法 。 這樣,如果您進行了部分讀取(因為子進程已寫入或用戶在不關閉流的情況下鍵入了一些數據),則可以立即轉發它,而不是將其緩沖在內存中並等待直到流關閉。 例如:
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,因此將嘗試為每個調用讀取一個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.