2012-07-24 49 views
2

我正在從事項目,我必須通過串行端口進行通信。我將通過RS232(大約6KB/10ms)從UART接收相當「大」的數據量,並且我必須收集並解碼它。解碼數據將被存儲到文件,並且它們中的一些將是在GUI中示出的需要關於C++/CLI通過串口通信的建議

我將使用C++/CLI(在使用.NET V4.0 的Visual Studio 2010由於管理的數據的工作和大量的庫。

而且我主要問題是:你會推薦我

A)當不使用線程,查找數據通過定時器每5毫秒...

B)不使用線程並根據傳入數據的事件查找數據...

C)使用線程...

你會推薦我什麼?我沒有太多的經驗來說明什麼是最好的解決方案。

感謝您對未來應對......

+0

這取決於。程序的SOLE目的是否等待這些數據,直到它被CTRL-C殺死爲止?如果是這樣,那麼串行端口上的「選擇」可能是最可行的解決方案。如果您想以任何方式與該計劃進行互動,恐怕線程將是您最好的選擇。 – ATaylor 2012-07-24 08:02:03

+0

有幾乎像正常文本一樣大膽,有點擊敗目的.. – stijn 2012-07-24 08:02:13

+0

我試圖高lite提供重要信息。但解決方案是線程。 Stijn是完全正確的。 – Scientist42 2012-07-24 09:29:00

回答

3

如果你需要一個GUI,你需要一個單獨的線程來獲取數據。沒有辦法可靠地獲取每個xmSec的數據並在UI線程中處理它。

除此之外,您似乎對某個線程的操作感到困惑:A和B可以與C結合使用。我建議使用單獨的線程輪詢數據端口或使用事件來檢查新數據何時到達。計時器可能不準確,畢竟它是端口規定數據傳入的速率,所以最好聽一下,而不是使用單獨的時基。將處理後的數據存儲在隊列中(又名生產者),並有另一個線程(又名消費者)從隊列中獲取大塊以將其刷新到文件(您不想每5mSec寫一個文件,而是寫一個文件大量的數據在每100mSec左右移動一次)。 然後,ui線程也可以從該隊列中預覽並顯示數據片段。

+0

謝謝,我以爲同樣的事情,但我正在考慮不使用線程。 – Scientist42 2012-07-24 08:10:02

+0

Nah - 使用一個線程,一個生產者 - 消費者隊列和一個'Buffer'類,你可以很容易地通過地址移動/排隊,以保存複製數據。從線程中的COM端口加載一個*緩衝區,排隊並立即爲下一次加載的數據在同一個var中創建一個新的* Buffer。聽起來像Buffer類中的10K緩衝區成員沒問題。不要使用不可重新定位的C++引用或任何堆棧對象 - 使用new()和指針。 – 2012-07-24 09:36:41

+0

..並且在處理完* Buffers後,不要忘記刪除()它們!有更快的機制使用*緩衝池,但我不認爲你真的需要這種錘子的COM端口悲慘。如果你需要在你的GUI中顯示一些數據,你必須將PostMessage()* Buffer實例加入到GUI中 - 相當簡單 - 只需將它們轉換爲lParam(或者使用BeginInvoke或Dispatcher或者其他GUI通常你使用的通訊工具)。 – 2012-07-24 09:41:26