2012-01-09 68 views
6

我試着用谷歌搜索這個,找不到答案,在這裏搜索,找不到答案。有沒有人研究過從線程a寫入Serial()對象(pyserial)是否線程安全,並阻止從線程b讀取數據?pyserial - 可能從線程寫入串行端口a,阻塞讀取線程b?

我知道如何使用線程同步原語和線程安全的數據結構,實際上我目前的這個程序的形式有一個專用於讀/寫串口的線程,我使用線程安全的數據結構來協調在應用程序中的活動。

如果我可以從主線程寫入串行端口(並且從不讀取),並且使用第二個線程中的阻塞讀取(並且從不寫入)從串行端口讀取,我的應用將受益匪淺。如果有人真的希望我進入爲什麼這將有利於應用程序,我可以添加我的理由。在我看來,只有一個Serial()實例,即使線程B位於Serial對象的阻塞讀取中,線程A在Serial對象上使用寫入方法也是安全的。

有人知道串口類是否可以這樣使用?

編輯:它發生在我身上,答案可能是平臺相關的。如果你對這樣的平臺有任何經驗,那麼很高興知道你正在從事哪個平臺。

編輯:只有一個響應,但如果任何人已經嘗試過這一點,請留下您的經驗迴應。

回答

11

我已經用pyserial完成了這項工作。從一個線程讀取並從另一個線程寫入不應該導致一般問題,因爲沒有真正的資源仲裁問題。串行端口是全雙工的,因此讀寫可以在同一時間獨立完成。

+0

您是否使用PySerial?並在哪些平臺上成功運行? – 2012-01-10 18:35:16

+0

我在Windows上使用PySerial,但無法想象它爲什麼不能在任何平臺上工作。 – TJD 2012-01-10 18:42:52

+0

感謝您分享您的體驗! – 2012-01-11 01:32:02

3

我已經在Linux(和Windows)上以這種方式使用了pyserial,沒有問題!

0

我建議將線程B從「阻塞讀取」修改爲「非阻塞讀取/寫入」。線程B將成爲您的串口「守護進程」。

線程A可以全速運行友好的用戶界面或執行任何實時操作。

線程A會向線程B寫入消息,而不是直接寫入串行端口。如果消息的大小/頻率較低,則消息本身的簡單共享緩衝區和用於指示新消息存在的標誌將會起作用。如果你需要更高的性能,你應該使用堆棧。這實際上是使用一個足夠大的數組來實現的,這個數組足夠積累許多要發送的消息和兩個指針。寫指針僅由線程A更新。讀指針僅由線程B更新。

線程B將獲取消息並將其發送到串行端口。串行端口應使用超時功能,以便讀取串行端口功能釋放CPU,從而允許輪詢共享緩衝區,並且如果存在任何新消息,則將其發送到串行端口。我將在此時使用睡眠來限制線程B使用的CPU時間。然後,可以使線程B循環到讀取串行端口函數。如果串口超時工作不正常,就像拔掉USB-RS232電纜一樣,睡眠功能會在好的Python代碼和不太好的代碼之間做出區別。

+4

雙線程方法的重點在於您不需要在任何地方進行輪詢,因爲讀線程只會阻止rcv。 – mikepurvis 2013-04-10 14:34:43