2016-09-21 6 views
0

Ich habe ein Programm, wo ich Daten über den seriellen Port hereinkommen, wandle ich diese Daten in ein Byte-Array und dann jedes Byte abfragen. Es gibt jedoch beispielsweise 6 Bytes (Byte [0] bis Byte [5]), die alle verschiedene Dinge bedeuten. Aber aus irgendeinem Grund gibt das letzte Byte (Byte [5]) immer eine 0x63 im Programm zurück, sogar durch die Daten, die in den Port kommen, sagt etwas anderes. Ich habe die eingehenden Daten mit einem Bereich überprüft, um die Probleme zu bestätigen. Unten ist der relevante Teil des Codes:SerialPort-Byte-Array, das immer 0x63 auf Byte [5] zurückgibt?

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

       } 
      } 
      } 

Und was ich merke, wenn ich in der Textbox meine berechnet Prüfsummen zeigt es die gleiche wie die Prüfsumme über den Umfang ist (in Byte [5]). Also muss irgendwo im Code sein, dass das Byte [5] auf 0x63 wechselt.

Dank, Ihre Hilfe geschätzt ...

+0

Ihr Code scheint nicht vollständig - zum Beispiel, zeigen Sie nicht Sie definieren Sie ' mySerialPort' während Sie 'port' öffnen und niemals verwenden. Auch Ihnen fehlen einige schließende Klammern. Es ist normalerweise einfacher, Ihnen zu helfen, wenn Sie vollständige Codeausdrucke zeigen. – Guss

+0

Entschuldigung, ich nahm Lasten heraus, dass ich mich irrelevant fühlte ... – Graham

+1

63 ist eine magische Zahl, im Gegensatz zu 0x63 ist es der ASCII-Code für "?". Wird von der ASCIIEncoding-Klasse generiert, wenn ein Bytewert> = 0x80 konvertiert werden muss. Dies ist der Standardwert für die SerialPort.Encoding-Eigenschaft. Verwenden Sie niemals ReadExisting(), um Binärdaten zu lesen, verwenden Sie stattdessen die Read() -Methode. Ignoriere seinen Rückgabewert nicht. –

Antwort

1

Es ist wahrscheinlich, dass das Problem ist, was @Hans Passant bezeichnet - wenn Sie binäre Daten lesen möchten (dh Bytes ohne die Sorge um, wie sie als Text codiert werden Zeichenketten), sollten Sie nicht die String Lesemethoden von SerialPort verwenden.

Sie sollten Read(Byte[], Int32, Int32) verwenden, um Ihre Bytes direkt in ein Bytearray zu bekommen. Der Code könnte wie folgt aussehen:

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

Seine in der Regel eine gute Idee, ein Array etwas größer als zuzuteilen, was Sie erwarten, zu empfangen und dann auf den read Wert beziehen, wie viele der Bytes im Array zu verstehen, tatsächlich enthält echte Daten.

Auf der anderen Seite, wenn Sie wissen, dass Ihr serielles Gerät immer Datenpakete fester Größe generiert (zum Beispiel vielleicht 5, in Ihrem Fall?), Dann können Sie einfach ein Byte-Array der Größe zuweisen, die Sie benötigen Sie haben jedes Mal ein vollständiges Paket gelesen - möglicherweise wiederholen Sie den Lesevorgang, wenn Sie nicht das volle Paket erhalten:

+0

Hey Guss, danke. Mit Read() habe ich es geschafft. Scheint gut zu gehen, danke ... – Graham

+0

@Graham, wenn die Antwort für Sie funktioniert, bitte genehmigen Sie es. Vielen Dank :-) – Guss