簡體   English   中英

Linux C ++:多個進程讀取相同的串行端口?

[英]Linux c++: multiple processes reading same serial port?

是否可能有多個進程同時在同一/dev/ttyUSBx設備上執行IO? 從我完成的測試來看,打開用於讀取的句柄的最后一個(最新)進程似乎獲得了輸出。 當該進程退出時,下一個最近的進程再次獲得輸出。

啟動進程A-從端口讀取輸出
啟動過程B-從端口讀取輸出。 進程A停止讀取。
停止進程B-進程A重新開始讀取。

連接是否有一個參數,可以讓兩者都獲得輸出? 文檔使它看起來像是可以分叉原始流程,但我寧願需要一個長期運行且需要多個單獨(壽命較短)的作業。

在任何操作系統上,多個進程能夠共享像這樣的基於串行的設備都是不尋常的。

您想要的是使過程A和B“訂閱”到過程C。過程C讀取設備並將其讀取的內容發布給訂閱者。 通信通道可以是任何適合您的IPC機制,例如管道,消息隊列或套接字。

這通常稱為“ 發布-訂閱”模式

解決一個事實:一次只能從一個特定的串行(COM)端口讀取一個進程的方法是使用虛擬COM端口。

偽造RS232串行端口

在上述文章中描述了該軟件,可讓您在Windows上創建虛擬COM端口對。 虛擬COM對的工作方式如下:當您通過COM-A發送數據時,它將在COM-B上接收,反之亦然。

反過來,這使您可以在程序中執行以下操作:

  1. 在真實的COM端口上偵聽數據(進程1)
  2. 從真實的COM端口讀取(進程1)
  3. 存儲您閱讀的內容(過程1)
  4. 通過虛擬COM端口對發送存儲的數據(過程1)
  5. 偵聽虛擬COM端口對上的傳入數據(進程2)
  6. 讀取,存儲和使用接收到的數據(過程2)

這樣,您可以在兩個進程中使用來自真實COM端口的數據,而不會遇到一個進程阻止另一個進程讀取COM端口的問題。 您可以反向執行相同的步驟,以將數據從進程2寫回到真實的COM端口。唯一的缺點是,進程2接收或發送數據的時間會很短。

我在需要攔截和處理另一個應用程序已連接到的COM端口的數據的情況下使用此解決方案。 因此,我只需將應用程序連接到虛擬COM端口,我的進程就將從該虛擬COM端口轉發從真實COM端口接收的原始數據。

希望這可以幫助。

注意:上面的程序適用於Windows,不確定是否有適用於Linux的版本,但是也許您可以找到適用於Linux的類似版本。

暫無
暫無

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

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