2012-10-06 71 views
3

我正在設計一個控制系統,它應該通過串口處理太多的執行器(或多組執行器)。新設計(尚未實現)應該通過多個POSIX線程來控制執行器。是否可以多次打開串口?

這是可能的多次打開一個串口(多線程)? 如果是,我會寫一個同步寫入/異步讀取機制。將有n線程M[0]M[n-1]它可以直接寫入數據到串口。它們不應該直接從串口讀取。相反,線程R應該從while(true)循環中的端口讀取數據,並將數據提供給等待它的相應線程。 (喚醒M[i]正在等待響應,當數據準備就緒並且它屬於i th線程時)

這一切都取決於是否可以通過多線程寫入串口。

筆記:我無法測試串行端口的行爲,因爲目前我在大學的機電一體化實驗室沒有對設備的訪問,

我使用的是補丁的內核2.6.38-8 Xenomai實時子系統(如果重要)

我將代碼移植到傳統的Linux串口通信方式。 (打開/dev/ttyS0,設置波特率,read(),write()等)目前第三方庫用於與串口通信。

回答

4

您只能打開一次相同的串行端口。第二次審判失敗,拒絕訪問。一旦端口被打開,您可以使用端口句柄在不同的線程中使用它。當然,你需要在這些線程之間同步端口訪問。

+0

我正在嘗試編寫無鎖代碼。你的意思是以某種方式保護包含'wite()'系統調用的代碼段使用「互斥量」?在同一時間嘗試寫入端口的兩個線程有​​問題嗎? –

+1

寫入操作不是原子的,所以如果不同的寫入調用不同步,結果是未定義的。 –

+1

如果你堅持無鎖(並且我看不到那個串口調用中的很多點),使用一個無鎖隊列來傳遞你的tx。緩衝區/字符串指針指向執行寫操作的一個線程。你仍然需要在隊列中發出信號,信號量或其他東西,以消除棘手,但你將會'無鎖',因爲它是值得的。 –