2010-08-19 68 views
0

我的應用程序需要通過串行通信與大約1MHz時鐘速度的嵌入式設備進行通信。在這個過程中,我們發現我們錯過了設備中的一些數據。c#.NET串行驅動程序性能

因此,我開始測試我使用的串行驅動程序的性能。該設備持續發送帶有計數器的原始數據,每個數據包的波特率爲115200比特/秒。當連接到超級終端並運行整晚時,我們發現它不會丟失任何數據。

但是,當我使用DataReceived處理程序和書面找到包是否丟失或不解析器的C#串口驅動程序,我們遇到的情況一樣

1)丟失的數據包 2)緩衝超限錯誤的。

我無法得出結論。我希望獲得關於可用數據的全部觀點。

它是一個延伸任何串行設備驅動程序邊界的測試嗎?或者.NET串行驅動程序寫入的方式不符合標記?

我實施的方式非常簡單。我剛剛使用了一個DataReceived處理程序,並將數據更新爲List,其中inturn由運行在具有最高優先級的不同線程中的解析器使用。在DataReceived hanlder中完成的功能只不過是將收到的數據添加到列表中。

由於提前

+0

我以某種方式懷疑它是'波特率115200 Kbps',你可能意味着115200bps。 – leppie 2010-08-19 05:02:21

+0

「解析器運行在具有最高優先級的不同線程中」 - 該線程可能會搶佔處理傳入串行數據的線程,具體取決於解析器線程如何處理從列表讀取以及如何同步線程 – Peter 2010-08-19 05:03:52

回答

2

我已經實現的方式是非常簡單的。我剛剛使用了一個DataReceived處理程序,並將數據更新爲List,其中inturn由運行在具有最高優先級的不同線程中的解析器使用。

這可能是你的問題。解析器很可能是受CPU限制的,這意味着將它固定在最高優先級上意味着它將消耗絕大多數CPU週期,直到它耗盡了要解析的東西,因此您的DataReceived線程缺乏執行並最終丟失東西。

總之,不會擺弄優先級,除非你知道你在做什麼。將優先級設置恢復正​​常,您將獲得更好的結果。

+0

謝謝。當我將線程的所有優先級視爲正常時,性能提高了很多。 – Kandy16 2010-08-19 10:34:34

+0

我只是想知道如何設置處理DataHandler的線程的優先級? – Kandy16 2010-08-19 10:43:45

0

使用List在兩個線程之間進行通信是一個壞主意,因爲它不是線程安全的(除非你有鎖 - 你是否?)。如果您使用的是.NET4,請使用ConcurrentQueue<T>

此外,正如Anon指出的,高優先級的線程很少是正確的答案。在這種情況下,解析器應該優先執行below normal優先級,因爲它的工作就是在不影響任何其他可能正在執行I/O的線程的情況下使用隊列。您可以留意解析器線程中的隊列長度,並在它離開太遠時發出警告。

+0

我在添加或刪除數據之前鎖定了列表。所以Iam確保溝通是線程安全的。 – Kandy16 2010-08-19 10:35:39