簡體   English   中英

將串行鏈接的輸入和輸出轉發到另一個進程的stdin和stdout

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM