2011-10-18 100 views
1

我與使用SerialPort的設備通信。該設備具有RS-485,另一端(PC)是RS-232(虛擬端口)。該設備正常工作,發送和接收數據。DataReceived事件有時不會觸發

問題是,DataReceived事件有時不會被觸發。我使用System.Timer每10秒發送一次數據到設備。大多數時候它工作正常,但每隔1到10分鐘我都沒有得到響應,然後,在再次2-4次DataReceived事件最終被解僱後,我得到一組數據(我之前「詢問」的所有內容)因爲在緩衝區中)。我的問題是:這怎麼可能

我不能在這裏放置代碼示例,我很抱歉,但我的應用程序中沒有多線程(只有主線程和Timer_Elapsed和DataReceived事件的線程,我認爲它們在單獨的線程中引發),我的DataReceived事件處理速度快,不應並行提升(10秒足夠長,設備響應時間低於1秒)。如果我使用Thread.Sleep,我確信它不會與任何東西進行交易。

它可能比軟件問題更硬件,因爲當我使用其他應用程序(其中一個設備製造商提供的用於測試連接的測試)測試COM端口時,COM端口以類似的方式運行看起來好像它是用C#編寫的)。但我對硬件並不擅長。也許PC有問題,或者COM端口(它不是內置的,但是外部的)?或者它可能是與操作系統相關的東西(我的應用程序是在Windows Server 2003下運行的Windows服務)。

回答

1

原來,這是一個硬件問題。

介乎設備的連接是這樣的: 設備<> RS-485 <> Converter1 <> LAN <> Converter2 <> RS-232 <>計算機<>虛擬COM

Converter1設備出現故障,它聚集並保存我的設備發送給它的數據。現在我知道什麼是錯,我可以讓有能力的人照顧它:)

感謝@Matthew Rodatus的幫助。你的回答以迂迴的方式引導我檢查到底什麼時候到達我的COM。

+0

爲什麼不給他一個upvote呢? – jgauffin

+0

沒問題,@Arie。很高興你想出來了。 –

3

這聽起來像緩衝區沒有被刷新,當你期望。

DataReceived事件不保證會爲接收到的每個字節引發。使用 BytesToRead屬性可以確定在緩衝區中有多少數據要讀取。

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx

(順便說一句,在DataReceived事件檢索確實上調輔助線程。)

您是否嘗試過調整的ReadBufferSizeReceivedBytesThreshold屬性?那就是我開始調查的地方。你知道消息的大概大小嗎?您可能希望將ReceivedBytesThreshold屬性設置爲低於您希望從設備接收的最小消息大小。然後,您可能需要一段時間忙於等待最後幾個字節來完成消息。

+0

ReceivedBytesThreshold = 1在我的應用程序(這是默認值)。 MSDN表示,ReadBufferSize不能小於4096.奇怪的是,我有兩個其他Windows服務與同一臺機器上運行的COM端口(稍有不同的設備,通過普通的RS-232連接到計算機)進行通信,重新工作正常。事件在他們的情況下得到提升和執行。所有3的代碼基數都是相同的,對於第3代有一些修飾。程序的結構確保在前面的DataReceived事件執行完成之前沒有數據到達。 – Arie