簡體   English   中英

串行C#中的datareceived事件處理程序

[英]datareceived Event Handler in Serial C#

我正在嘗試實現基於數據接收的事件處理程序,我想我能夠從端口接收數據,但是執行事件時遇到了困難。.我已經嘗試了ReadLine和ReadExisting ..請您對我的代碼發表評論。.謝謝,

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   
}

我在串行通信方面做了很多工作,而DataReceived從未像我想要的那樣工作。 SerialPort上有一個名為ReceivedBytesThreshold的屬性,該屬性在事件觸發時應該會更改,但是我碰運氣了。 對該事件進行一些谷歌搜索,您將獲得成千上萬個報告此問題的結果。 該事件有時可以工作,但我不會依靠它進行關鍵任務操作。

如果您正在尋找行尾,我發現這樣做的更好方法是簡單地執行一個緊密循環,如果有可用字節,則將其連續讀取到緩沖區中,然后在遇到行時在緩沖區上調用LineReceived方法結尾。 將其放在自己的線程上,它應該可以解決問題。 在循環內添加一些Thread.Sleep() ,以防止其接管。

如果您不希望對串行流產生瞬時反應,則每秒鍾或半秒在線程計時器上運行它。 計時器的每個滴答聲,都將所有現有字節讀入緩沖區,並且每當遇到一行結尾時,調用LineReceived

我還使用DataReceived事件在我們的一種產品中取得了巨大的成功。 我正在執行的協議要求6個字節的最小數據包大小,因此我將其用作接收閾值。

我確保保留所有孤立數據,如果讀取不完整或數據包格式錯誤,則在下次事件發生時進行重構。 我確實很少遇到這種實現問題。 我建議鎖定事件處理程序,這樣您就不會在串行端口上引起競爭,但是可能不需要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM