none
DataReceived動作 RRS feed

  • 問題

  • 大大您們好,我想詢問rs232的事件觸發,我知道網路上有很多相關的,但我一直想不懂一個觀念,我再事件觸發下寫了如下方法,
    public void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
          int bufferLen = Port.BytesToRead;
          count++;
          Console.WriteLine("triggle1 len:{0}, {1}", bufferLen,count);
          if (bufferLen == 8)  //接收成功
          {
                Console.WriteLine("triggle len:{0}", bufferLen);
                RecEventBeTriggled();  //自行寫的方法
          }
          else if (bufferLen > 8)
          {
                Console.WriteLine("discard");
                Port.DiscardInBuffer();
           }
    }
    當我用另一程式,傳送一筆8個byte資料到此程式時,會顯示如下
    triggle1 len:8, 1
    triggle len:8

    triggle1 len:8, 2
    triggle len:8

    triggle1 len:1, 3
    triggle1 len:4, 4
    triggle1 len:4, 5
    triggle1 len:8, 6
    triggle len:8

    triggle1 len:1, 7
    triggle1 len:4, 8
    triggle1 len:4, 9
    triggle1 len:8, 10
    triggle len:8
    triggle1 len:8, 11
    triggle len:8
    每次都不會相同,我理解,因為會一直收到資料為主,但有幾次讓我覺得對他的事件觸發動作原理有點疑惑,如黑體,他會一直觸發到我收到相同資料長度為主,但是請問一下為何有時會有像黑體的情況,雖然不是每次發生,但我都一次傳送8byte資料,照理說他收到這樣的資料,不是就要停止觸發了嗎,還是我觀念上不正確,請大大幫我解惑,謝謝

    2010年10月21日 上午 04:06

所有回覆

  • 聽不太懂你的描述.

    一般來說SerialPort.DataReceived只要在接收緩衝區收到的Byte數超過SerialPort. ReceivedBytesThreshold 屬性值就會觸發.

    在MSDN中有個重點: 收到的每個位元組不一定會引發 DataReceived 事件。 請使用 BytesToRead 屬性判斷緩衝區中剩餘的應讀取資料量。

    意即表示當你的 SerialPort. ReceivedBytesThreshold 屬性值為1, 而你一次收到8Bytes時, 它就只會觸發一次.

    看上述的資料, 你應該總共是送了五次8Bytes資料進來.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月21日 上午 04:24
    版主
  • 大大您好,我可能說得不夠明白,再次註解如下,謝謝
    送一次顯示
    triggle1 len:8, 1
    triggle len:8
    再送一次顯示
    triggle1 len:8, 2
    triggle len:8
    再送一次顯示
    triggle1 len:1, 3
    triggle1 len:4, 4
    triggle1 len:4, 5
    triggle1 len:8, 6
    triggle len:8
    再送一次顯示
    triggle1 len:1, 7
    triggle1 len:4, 8
    triggle1 len:4, 9
    triggle1 len:8, 10
    triggle len:8
    triggle1 len:8, 11
    triggle len:8
    2010年10月21日 上午 05:21
  • 四次喔 ? 那這我要測測看, 因為我沒遇過這種狀況

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月21日 上午 05:23
    版主
  • 大大您好,我傳和收之間只有間隔大約50ms,不曉得和這有無關係,謝謝
    2010年10月21日 上午 06:04
  • 可能是因為你程式中RecEventBeTriggled的方法執行時間超過你的時間間隔.

    我有隻交換機計費的程式也是透過RS232,而程式在DataReceived內只做接收資料,而真正需要長時間處理部分的程式用獨立的Thread方式運行.

    2010年10月21日 上午 09:09