2009-08-21 127 views
3

我正在開發一些基於串行通信協議的監控工具。C#serialPort速度

Serial BaudRate = 187,5kb 我使用System.IO.Ports.SerialPort類。

該協議有4種幀。他們有1Byte,3Bytes,6Bytes,10-255Bytes。 我可以和他們一起工作,但我收到他們來不及回覆

一開始我收到第一個包裝後,前。 96ms(太晚),它包含大約1000B。這意味着20-50幀(太多,太晚)。 後來它的工作比較穩定,3-10Bytes但由於它包含了1-2幀,所以還爲時過晚。當然第1幀是可以的,但是2太遲了。

您能指出我該如何處理它更可靠嗎?我知道這是可能的。

Revision1:

我試着筆直的路:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
     if (!serialPort1.IsOpen) return; 
     this.BeginInvoke(new EventHandler(this.DataReceived)); 
} 

和研究背景工人: 而且......新胎面(讀) 和...總是一樣的。太遲了,太慢了。 我是否必須回到WinApi並導入一些kernel32.dll函數?

修訂2: 這是踏入方式代碼中使用的部分:

int c = serialPort1.BytesToRead; 
byte[] b = new byte[c]; 
serialPort1.Read(b, 0, c); 

我想這是有些問題SerialPort類裏面流使用。或者有一些同步問題。

修訂3: 我一次不使用兩個!我只是嘗試了不同的方式。

問候 MarekK

+0

沒有某種代碼和某種信息,很少有人能夠幫助你。你如何從港口讀書? – 2009-08-21 12:47:15

+0

一般的代碼工作,是相當大的。它看起來代碼的某些部分正在等待某件事。我不知道女巫。 – MrHIDEn 2009-08-21 12:57:00

+0

**我試圖使用BaseStream這是SerialPort子類。 我得到了同樣的結果。但是!!!!!! 我開始爲我的筆記本電腦尋找PCIe卡,並且我發現即使在PCI Express卡中,基於USB的轉換器也不能提供良好的通信級別,這是因爲USB堆棧。據我所知,數據流正在等待USB程序。我可以想象這會造成最大的困難。我打算購買PCIe 232卡。** – MrHIDEn 2009-08-27 14:01:28

回答

1

也許你應該閱讀這first,因爲這個錯誤有DataReceived事件檢索不有時火做的,現在還沒有固定的框架3.0/3.5。另外,你應該閱讀here關於這個海報誰向微軟報告,當他有問題使用VS2008/NET 3.5下的問題......我不能說這是否是真的......但值得記住的東西關於......並且微軟確實對.NET版本2中引入的.NET版本有一定的難度。

當時我使用的是.NET 1.1,我遇到過使用該版本的建議與VB6的ActiveX控件一起使用,根據互聯網上的sources,它是最好的串行通信控件!

你可能會更好地調查使用第三方代碼來處理串行通信,通常是在託管世界之外編寫的,即使用大量p/invokes進行非託管的。

我已經使用了MSDN文章here,我確實發現在發現約翰·欣德版的嘗試很倒胃口,因爲沒有辦法做到這一點異步,再加上它是一個可怕的編碼經驗..

我最終使用了由Franson提供的產品,其結果比Hind的代碼更好。

希望這會有所幫助, 最好的問候, 湯姆。