2013-03-22 100 views
0

我正在編寫一個gtk應用程序(使用C++)通過串口與電機控制器進行通信。我正在使用Linux Ubuntu和termios lib。 我需要建議最佳解決方案。 所以這裏是我有的約束: 1-當我發送請求時,控制器發回我一條消息 2-控制器可以隨時向我發送錯誤通知如果發生錯誤 3-請求是ANSII字符字符串(CR) 4-控制器答案是ANSII字符字符串完成[CR] [NL]使用C中的多線程進行串口編程

因爲(3)和(4) 由於GUI +(2),我想到了多線程:在串口上寫用戶請求的主線程和其他讀取控制器答案的無限線程。你認爲這是一個好主意嗎?

第二個問題:如果我正在使用多線程,我希望能夠在需要時寫入數據,所以我必須在寫入期間找到一種方法來停止/睡眠讀取線程,也許使用pthread_cond_wait。我對嗎?我看過民意調查和選擇功能,但我不太瞭解他們,我不確定他們是否與規範模式兼容。

我開始使用多線程和串口。我在谷歌,論壇上閱讀了很多東西......但對於初學者來說,大量的信息是有點壓倒性的。

謝謝你的幫助。

+2

要做的最好的事情就是開始嘗試。你的建議聽起來很合理。當你遇到特定問題或有特殊問題回到SO時。 – Nick 2013-03-22 10:50:43

回答

0

在這裏考慮的主要問題是從串行端口分離圖形用戶界面將是你的延誤。您是否曾經執行過任何會導致您需要輪詢端口一段時間的操作,這對用戶來說會很明顯?如果您只是在做請求/回覆,並且這些延遲真的很低,您的用戶可能不會注意到任何延遲。此外,接收這些異步錯誤消息也不會導致我想象的任何明顯的延遲。除非你知道在Init消息或類似的東西發送到控制器之後可能會有許多秒的延遲,否則可能會讓你的生活更簡單,讓應用程序單線程化。

另一方面,如果會出現這些大的延遲,或者您只是想要使用多線程,我只需從1個線程開始,這個線程可以完成所有的GUI工作,而另一個線程可以處理所有的串行IO。在這兩個線程之間使用消息傳遞或事件通知來協調您的活動,它應該非常簡單。

+0

感謝您的回覆。我用一個線程做了一個請求/回覆應用程序,運行良好,但正如我在第一步所說的那樣,馬達控制器也可以隨時向我發送錯誤消息。用這種方法我無法捕捉到這個錯誤信息。我沒有看到如何在不使用凍結GUI的無限循環的情況下進行輪詢。在使用多線程之前,我一直試圖使用替代解決方案... – BBa 2013-03-25 16:56:32

+0

我不確定termios lib提供了什麼,但是您希望查找在UART中可用數據時生成事件的內容。然後你可以只聽這個事件,你不需要輪詢端口。 – ThePosey 2013-03-25 18:19:01