簡體   English   中英

Linux:通過一個進程從串行端口讀取數據,然后通過另一個進程寫入數據

[英]Linux: Read data from serial port with one process and write to it with another

我在Raspberry Pi上使用串行GPS / GNSS設備遇到了問題。 有問題的設備是鏈接到/dev/gps的u-blox GNSS接收器。

我試圖實現記錄該設備的輸出數據並同時向其發送校正數據。

更具體地說,我使用RTKLIB( http://www.rtklib.com/str2str工具將NTRIP / RTCM校正數據發送到GNSS接收器,以便使用DGNSS / RTK獲得更好的位置估計。 接收器的輸出數據將由基於GPS守護進程(gpsd)的python腳本記錄。

但是,我想主要問題與串行端口控制有關。 當我先運行寫入過程(str2str),然后同時運行任何讀取過程(我的python腳本/ gpsd前端(例如cgps)/ cat)時,讀取過程將輸出數據幾秒鍾,然后凍結。 我使用哪種工具讀取數據都沒有關系。

我發現了這個問題: https : //superuser.com/questions/488908/sharing-a-serial-port-between-two-processes 因此,我確保進程可以讀寫訪問該設備,甚至嘗試以超級用戶身份運行它們。 此外,我偶然發現了socat和虛擬串行端口,但沒有發現任何用處。 適用於Linux的虛擬串行端口

有什么方法可以通過一個進程從串行端口讀取數據,然后通過另一個進程寫入數據嗎? 我現在知道的唯一解決方案可能是使用pySerial在python中重寫讀寫過程。 這將只允許一個進程訪問串行設備,但是這意味着大量的工作。

最終,我發現了一個使用類似於此的構造的靈魂: https : //serverfault.com/questions/453032/socat-to-share-a-serial-link-between-multiple-processes

第一個socat實例(A)從TCP連接獲取GNSS校正數據,該連接通過管道傳輸到socatB。SocatB管理與串行設備的連接,並將輸出數據傳輸到另一個socat實例C,這允許其他進程(例如gpsd)執行以下操作:連接並從TCP端口獲取接收器的輸出。

總的來說,這看起來像:

socat -d -d -d -u -lpA   TCP4:127.0.0.1:10030 - 2>>log.txt | 
socat -d -d -d -t3 -lpB  - /dev/gps,raw  2>>log.txt|
socat -d -d -d -u -lpC   - TCP4-LISTEN:10031,forever,reuseaddr,fork 2>>log.txt

只需要一個進程來管理串行連接,它就不再阻塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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