2012-10-20 73 views
0

我有一個表單,我可以接收數據並將其顯示在richtextbox中,但我需要的是讀取連續來自串口的數據並進行相應的解碼。串口數據接收處理

例如:我以字節格式接收數據,其格式爲36 0 0 0 1 0 0...., 36用於指示幀n的起始位置rest是將通過其觸發事件的數據。

我的代碼:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
     // get number off bytes in buffer 
     Bytenumber = serialPort1.BytesToRead; 

     // read one byte from buffer 
     ByteToRead = serialPort1.ReadByte();      

     this.Invoke(new EventHandler(DoUpdate));    
    } 

上面的代碼是用來接收數據並觸發一個事件。事件的代碼如下:

int w=0; 

public void DoUpdate(object sender, System.EventArgs e) 
{ 
     byte[] t = new byte[Bytenumber]; 

     for(int g=0; g<Bytenumber;g++) 
     { 
      t[g] = Convert.ToByte(ByteToRead); 
     } 

     w++; 

     // richTextBox1.Text += ByteToRead; 
     if (ByteToRead == 36) 
     { 
      for (int r = 0; r <= 73; r++) 
      { 
       if (ByteToRead == 0x01) 
       { 
        timer1.Start(); 
        w++; 
       } 
      } 
     } 
     } 

在接收事件處理程序我尋找36的數據(即,幀的開始)一旦我得到我尋找從緩衝器1秒。問題是當我得到36(即幀的開始)時,相同的數據保留在if循環中,並嘗試與1進行比較,在任何情況下都不會爲真。我需要的是讀取來自緩衝區的數據的下一個字節,一旦我得到36.

回答

1

我可以發現一些問題。一點代碼審查:

Bytenumber = serialPort1.BytesToRead; 

字節編號是字節在這一刻閱讀。將其保留在成員字段中不是線程安全的。

ByteToRead = serialPort1.ReadByte();  

這隻讀取1個字節。然後,在另一個線程:

byte[] t = new byte[Bytenumber]; // ByteNumber may have changed already 
    for(int g=0; g<Bytenumber;g++) 
    { 
     t[g] = Convert.ToByte(ByteToRead); // store the _same_ byte in all elements 
    } 

你應該做的(不完整的代碼):

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    // get number off bytes in buffer 
    int n = serialPort1.BytesToRead; 

    byte[] buffer = new byte[n]; 

    // read one byte from buffer 
    int bytesToProcess = serialPort1.Read(buffer, 0, n);      

    this.Invoke(UpdateMethod, buffer, bytesToProcess);    

} 

但做搜索互聯網工作代碼。我只是做了這件事。