2016-09-21 4 views
0

serialPort를 통해 들어오는 데이터가있는 프로그램이 있는데이 데이터를 바이트 배열로 변환 한 다음 각 바이트를 조사합니다. 그러나 예를 들어 6 바이트 (바이트 [0] - 바이트 [5])가 있으며 이는 모두 다양한 것을 의미합니다. 그러나 어떤 이유로 마지막 바이트 (byte [5])는 프로그램에서 0x63을 반환합니다. 포트로 들어오는 데이터를 통해서조차도 다른 것을 말합니다. 문제를 확인하기 위해 범위로 들어오는 데이터를 확인했습니다. 다음은 관련 코드의 일부입니다SerialPort 바이트 배열은 항상 byte [5]에 0x63을 반환합니까?

 SerialPort mySerialport = new SerialPort("COM3",9600, Parity.None, 8, StopBits.One); 
     rxString = mySerialPort.ReadExisting(); 
     byte[] bytes = Encoding.ASCII.GetBytes(rxString); 
     textbox1.Clear(); 

     if (bytes[0] == 0x12)       //Header 
     { 
      if (bytes[1] == 0xA6)      //Header 
      { 
       if (bytes[2] == address)    //Address 
       { 
        byte A = bytes[3]; 
        byte B = bytes[4]; 
        var checksum = ((address + A + B)^0xFF) & 0xFF; 

        if (checksum == bytes[5]) 
        { 
         textbox1.AppendText("Connected OK!!!"); 
        } 
        else 
        { 
         textbox1.AppendText("Byte 5 = " + bytes[5]); 
        } 

       } 
      } 
      } 

그리고 내가 내가 텍스트 상자에 내 계산 체크섬을 표시하는 경우는 범위에 대한 체크섬과 동일, 알이 (바이트 [5]). 따라서 바이트 [5]가 0x63으로 변경되는 코드 어딘가에 있어야합니다.

덕분에, 당신의 도움이 ... 감사합니다

+0

코드가 완전하지 않은 것처럼 보입니다. 예를 들어, mySerialPort'를 실행하고'port'를 열어서 사용하지 마십시오. 또한 닫는 괄호가 빠져 있습니다. 전체 코드 인쇄물을 보여 주면 대개 도움이됩니다. – Guss

+0

죄송합니다. 부적절하다고 느낀로드를 가져 왔습니다. – Graham

+1

63은 0x63과 달리 마법의 숫자이며, '?'에 대한 ASCII 코드입니다. 바이트 값> = 0x80을 변환해야하는 경우 ASCIIEncoding 클래스에 의해 생성됩니다. SerialPort.Encoding 속성의 기본값입니다. ReadExisting()을 사용하여 이진 데이터를 읽지 마십시오. 대신 Read() 메서드를 사용하십시오. 반환 값을 무시하지 마십시오. –

답변

1

문제가 @Hans 옆모습이 언급 된 것입니다 가능성이 높습니다 - 당신이 즉 바이트들이 텍스트로 인코딩하는 방법에 대한 걱정없이 (이진 데이터를 읽으려면 문자열) 인 경우 SerialPort이라는 읽기 방법을 사용하면 안됩니다.

바이트를 바이트 배열로 직접 가져 오려면 Read(Byte[], Int32, Int32)을 사용해야합니다. 코드는 다음과 같습니다

보통
SerialPort mySerialport = new SerialPort("COM3",9600, Parity.None, 8, StopBits.One); 
byte[] bytes = new byte[10]; 
int read = mySerialport.Read(bytes, 0, 10); 

그것을 실제로 배열의 바이트 얼마나 많은을 이해하기 위해 read 값을 참조 다음 받으실 것보다 약간 더 큰 배열을 할당하고, 좋은 생각 실제 데이터를 포함합니다.

반면에 직렬 장치가 항상 고정 크기의 데이터 패킷을 생성하는 경우 (예 : 5 일 경우), 필요한 크기의 바이트 배열을 할당하고 확인할 수 있습니다 매번 전체 패킷을 읽었을 가능성이 있습니다. 전체 패킷을받지 못한 경우 읽기를 반복 할 수 있습니다 :

int read = 0; 
while (read < packet_size) { 
    read += mySerialport.Read(bytes, read, bytes.Length); 
} 
+0

안녕하세요, 고마워요. 나는 그것을 Read()를 사용하여 작동 시키도록 관리했다. 잘 될 것, 감사합니다 ... – Graham

+0

@ 그래함, 대답이 당신을 위해 작동한다면, 그것을 승인하십시오. 감사 :-) – Guss

관련 문제