2012-10-20 4 views
0

데이터를 수신하여 richtextbox에 표시 할 수있는 양식이 있지만 직렬 포트에서 연속적으로 오는 데이터를 읽고 그에 따라 디코딩해야합니다.직렬 포트 데이터 수신 처리

예 : 36 0 0 0 1 0 0...., 36은 이벤트가 시작되는 데이터 인 프레임 나머지 시작을 나타내는 데 사용되는 형식의 바이트 수입니다.

내 코드 : 코드 위

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));    
    } 

는 데이터를 수신하고 이벤트를 발생하는 데 사용됩니다. 다음 이벤트에 대한 코드는 다음 이벤트 핸들러 I가 36을 찾고받은 데이터

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++; 
       } 
      } 
     } 
     } 

(즉, 프레임의 시작) 내가 버퍼로부터 1 초를 찾고 있다는 일단. 문제는 내가 36 (즉, 프레임 시작)을 얻을 때 동일한 데이터가 if 루프에 유지되고 어떤 경우에도 true가 아닌 1과 비교하려고 시도하는 것입니다. 버퍼가 36이되면 다음 바이트의 데이터를 읽어야합니다.

답변

1

몇 가지 문제점을 발견 할 수 있습니다. 약간의 코드 검토 :

Bytenumber = serialPort1.BytesToRead; 

ByteNumber는 현재이 시점의 바이트 수입니다. 스레드를이 필드에 유지하는 것은 스레드로부터 안전하지 않습니다.

ByteToRead = serialPort1.ReadByte();  

이 값은 1 바이트 만 읽습니다. 그리고, 다른 스레드 :

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);    

} 

을하지만 코드를 작업을 위해 인터넷을 검색 할 :

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 
    } 

당신은 (완료되지 않은 코드를) 어떻게해야합니까. 방금 만들었 어.