我目前正在使用 Linux 檔案描述符通過串行埠與外部設備通信,我想知道我是否可以復制回傳設備的結果。
具體來說,我使用檔案描述符 5 來讀取和寫入 raspbian 設備中的串行埠 /dev/ttyACM0。
exec 5<>"/dev/ttyACM0"
在后臺,我運行了一個函式來在回應出現時不斷地從埠讀取資料以決定下一步。
function __processing__(){
local line
while read line<&5; do
... some processing ...
... echo $line > "log.txt"
done
}
如果我只是向串口發送單個命令并讓后臺功能處理回應,它就可以正常作業。當我開始使用其他軟體在前臺使用 XMODEM 協議傳輸資料時,問題就出現了。
sx -vv -k "./firmware_update.bin" >&5 <&5
盡管日志檔案中記錄了 ACK 回應,但該行程一直在 ACK 上超時。所以我懷疑是因為后臺行程從FD5讀取,什么都沒留下sx。然后我嘗試洗掉后臺行程,只運行sx命令,當它成功發送所有資料包時,我的懷疑得到了證實。
但是后來我沒有任何來自串行埠的記錄回應來實際知道下一步該做什么。
所以我的問題是:有沒有辦法重寫后臺函式,以便它仍然可以讀取回應,而不會干擾sx?我知道我們可以使用tee命令從標準輸出復制資料,我可以用 FD5 實作類似的東西嗎?
謝謝大家。
uj5u.com熱心網友回復:
嘗試
sx -vv -k "./firmware_update.bin" >&5 < <(__processing__)
它使用 Bash 行程替換(請參閱ProcessSubstitution - Greg's Wiki)導致從函式sx的輸出中獲取其輸入 。__processing__您還需要修改函式以將其輸入(從 FD5)復制到其標準輸出。類似于以下內容:
function __processing__
{
local line
while IFS= read -r line<&5; do
# ... some processing ...
printf '%s\n' "$line" > "log.txt"
printf '%s\n' "$line" # Copy input to standard output
done
}
- 該代碼是Shellcheck -clean。
- 請參閱函式BashFAQ/001(如何逐行(和/或逐欄位)讀取檔案(資料流、變數)?)以了解我在該
while ...行所做的更改。 - 請參閱為什么 printf 比 echo 更好?解釋為什么我
echo用printf. - 請注意,即使我進行了更改,
__processing__如果來自 FD5 的資料是二進制的,該函式也不會可靠地作業。ASCII NUL 字符將丟失(Bash 字串不能包含它們),這取決于由換行符終止的輸入塊。在這種情況下,我不知道您正在處理什么樣的資料。它可能不是 Bash 代碼可以處理的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439457.html
