2013-07-13 91 views
-1

目前我忙於使用C#的串口編程,並且對這個東西很新。我已經構建了一個控制檯應用程序...在這個應用程序中,我每200毫秒輪詢一個RS 232設備。設備必須每次響應輪詢一個字節的響應。C# - 串行端口 - 數據接收事件 - 奇怪的行爲

大多數時候,我通過數據接收事件獲取期望的字節。但是,有時數據收到的事件不會觸發......甚至,我試圖讀取每個輪詢後可用的字節..我沒有得到預期的字節。

在沒有運氣的情況下花費了很多時間之後,當串口應用程序運行時,我意外地打開了瀏覽器。突然,收到的數據事件開始爲每個民意調查...在瀏覽器被打開後,幾秒鐘後,事件再次發生火災。我試着打開一些其他應用程序,同樣的行爲繼續。幾秒鐘之後,事件就會被解僱,之後沒有事件發生。看起來如果CPU很忙,收到的數據事件工作正常。

有人可以遇到同樣的問題嗎?請建議如何確保每次收到數據接收事件觸發。謝謝!

請在下面找到示例代碼。

Every 200 ms. 


Serial.Parity = System.IO.Ports.Parity.Mark; 
Thread.Sleep(2); 
Serial.Write(0x01, 0, 1); 
Thread.Sleep(1); 
Serial.Parity = System.IO.Ports.Parity.Space; 
Thread.Sleep(2);` 
+0

我不知道你是如何管理接收。但是,我添加了一個名爲Data的Accessor從EventArgs開始的類。 – Marc

+0

你能顯示代碼嗎?發送投票的代碼在哪裏? – dbasnett

+1

如果你顯示你的代碼,這將有所幫助,對問題的口頭描述不夠好。通過輪詢串口是什麼意思?數據接收事件在字節到達時觸發,不需要額外的輪詢。 – user2019047

回答

-2

如果將傳入的數據作爲參數傳遞給事件處理函數是非常合理的。不幸的是,DataReceived事件不會這樣做,通常只是一個愚蠢的設計。

我建議你改爲在BaseStream的串口上撥打BeginRead,並提供一個回調。然後,當你的活動和你的數據到達時一起。

BeginRead使用鏈接調用的好處是,如果串行緩衝區包含多條消息,則會獲得多個BeginRead回調。與DataReceived一樣,您必須檢查BytesAvailable並確定緩衝區中有多少條消息和部分消息,因爲如果您沒有全部讀取它們,事情就會卡住。一般來說,我發現.NET提供的Ports.IO.SerialPort類完全沒用,對於我的工作,我使用Win32 API(我自己創建了.NET包裝器)。