2017-06-13 73 views
0

我在Raspberry Pi上使用串行GPS/GNSS設備發現了一個問題。有問題的設備是一個符合/dev/gps的u-blox GNSS接收器。Linux:通過一個進程從串口讀取數據,並用另一個進程寫入數據

我試圖實現記錄來自該設備的輸出數據並同時向其發送校正數據。更具體地說,我使用RTKLIB(http://www.rtklib.com/str2str工具來發送NTRIP/RTCM校正數據到GNSS接收器,以便使用DGNSS/RTK獲得更好的位置估計。 接收器的輸出數據將通過基於GPS deamon(gpsd)的python腳本進行記錄。

但是,我猜主要問題是與串口控制有關。 當我首先運行寫入過程(str2str),然後同時讀取過程(我的python腳本/ gpsd前端(例如cgps)/ cat)時,讀取過程將輸出數據幾秒鐘並凍結。使用哪個工具讀取數據並不重要。

我發現這個問題:https://superuser.com/questions/488908/sharing-a-serial-port-between-two-processes。因此我確信這些進程能夠訪問設備,甚至嘗試以超級用戶身份運行它們。此外,我偶然發現了socat和虛擬串行端口,但沒有發現任何用處。 (Virtual Serial Port for Linux

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

回答

0

最後我發現了一個soultion使用以某種方式與此類似的結構:https://serverfault.com/questions/453032/socat-to-share-a-serial-link-between-multiple-processes

第一socat實例(A)獲取GNSS校正從TCP連接,這是管道輸送到socat B. Socat B數據管理連接到串行設備和管道輸出數據到另一個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 

只有一個進程管理串行連接,它不會再阻止。

相關問題