2011-03-21 39 views
0

我想實現的datarecieved基於事件的處理程序,我想我能夠從端口接收數據,但其執行情況的困難。我曾經嘗試都的ReadLine和ReadExisting ..可以請你對我的代碼評論..謝謝,DataReceived事件檢索處理程序的串行C#

private void Form1_Load(object sender, EventArgs e) 
     { 
       // graphing stuff 
      portname = "COM1"; 
      parity = Parity.None; 
      BaudRate = 115200; 
      stopbits = StopBits.One; 
      databits = 8; 
      port = new System.IO.Ports.SerialPort(portname); 
      port.Parity = parity; 
      port.BaudRate = BaudRate; 
      port.StopBits = stopbits; 
      port.DataBits = databits; 
      port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 
      port.Open(); 
      count = 0; 
      } 


    void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     try 
     { 
     line = port.ReadLine(); 
     count++; 
     this.BeginInvoke(new LineReceivedEvent(LineReceived),line); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
    } 

    private delegate void LineReceivedEvent(string text); 

    private void LineReceived(string text) 
    { 

     if (zedGraphControl1.GraphPane.CurveList.Count <= 0) 
      return; 
     LineItem curve = zedGraphControl1.GraphPane.CurveList[0] as LineItem; 
     if (curve == null) 
      return; 
     IPointListEdit list = curve.Points as IPointListEdit; 
     double value = double.Parse(text); 
     list.Add(count, value); 
     // graphing stuff 
    } 

// graphing stuff 
} 
+0

保持波特率低。您一次只能調用一個數字,這可能導致UI線程停止繪製。您的用戶每秒只能看到約20次更新,然後纔會變爲模糊狀態。緩衝區來解決問題。 – 2011-03-21 17:47:30

回答

1

我已經做了很多工作,通過串行通信,並DataReceived從來就像我想它。有是應該改變事件觸發時稱爲ReceivedBytesThresholdSerialPort的屬性,但我已經打了與它錯過運氣。在這個事件上做一些搜索,你會有成千上萬的結果報告它的問題。這個事件有時可以發揮作用,但我不會依賴它來完成關鍵任務操作。

如果您正在尋找行結束符,我發現要做到這一點的更好方法是隻需要一個緊密的循環,如果它們可用,就會不斷地將字節讀入緩衝區,然後調用緩衝區上的LineReceived方法它遇到一條線結束。把它放在它自己的線程上,它應該做的伎倆。在循環內添加一些Thread.Sleep()以防止它接管。

如果你不找的串行數據流的瞬時反應,然後在一個線程定時器運行它的每一秒或半秒。定時器的每個滴答聲,將所有現有字節讀入緩衝區,並且每當遇到一行結束時調用LineReceived

+0

您對DataReceived有什麼問題?它對我來說工作得很好(我認爲我的ReceivedBytesThreshold = 1) – Justin 2011-03-21 17:29:08

+0

有時候,我沒有任何問題。其他時候,它應該拒絕發射。當進入的數據非常間歇時(並且波特率很慢),我傾向於擁有更好的運氣。我認爲這與事件處理程序在下一組數據出現之前不會退出有關。但是,我發現通過手動方式爲我平均獲得更好的結果。 – drharris 2011-03-21 17:36:10

+0

好吧..我只是修復了一些問題,它似乎工作,但並不像預期的那樣(我的代表聲明是在我稱之爲它之後!)一些數據沒有被雙倍識別爲double .Parse ,但在另一端,我特別注意發送的內容是換行的雙倍!無論如何,我做了float.tryparse,它似乎工作,以便解脫,但是,我知道我沒有得到他們所有的人......這項工作將是有點關鍵時,因爲我需要考慮什麼drharris建議.. – Programmer 2011-03-21 17:43:58

0

我也使用DataReceived事件檢索用在我們的產品的一個巨大的成功。我正在執行的協議要求最小數據包大小爲6個字節,所以我使用的是我的接收閾值。

我一定要保持任何孤立數據,以及事件發生的下一次重建,如果我得到一個不完整的讀或惡意數據包。我真的很少有這個實現的問題。我會建議鎖定在事件處理程序中,以免在串口上競爭,但可能不需要。