2016-04-05 7 views
0

Ich empfange einen Api-Frame von einem XBee-Endpunkt an einen XBee-Koordinator, der über einen COM-Port mit meinem Computer verbunden ist.C# Lesen eines von einem XBee empfangenen API-Frames

Dieser API-Frame, den ich erhalte, ist eine Änderungserkennung, die gesendet wird, wenn eine Änderung erkannt wird (einfach genug). Es gibt kein festgelegtes Intervall für diese Änderungserkennung.

Wenn diese api Frame empfangen möchte ich es in meinem C# .NET-Anwendung lesen zu können, aus dem folgenden Grund:

Wenn der Rahmen ist wie folgt: 7E 00 0A 83 00 00 1C 00 01 00 81 00 80 5E (12. Position ist 80) Ich möchte angeben, dass das Licht aus ist.

Wenn der Rahmen wie folgt ist: 7E 00 0A 83 00 00 2B 00 01 00 81 00 81 4E (12. Position ist 81) Ich möchte angeben, dass das Licht an ist.

Mein Code dafür ist sehr einfach - alles, was ich vermisse, ist, den Rahmen in C# zu bekommen. Hier ist mein Code:

 byte[] switch_indicator = somehow_read_the_frame; 
     if (switch_indicator[12] = 0x81) 
     { 
      textBox1_TextChanged.BackColor = System.Drawing.Color.Green; 
     } 

     if (switch_indicator[12] = 0x80) 
     { 
      textBox1_TextChanged.BackColor = System.Drawing.Color.Red; 
     } 

Wie würde ich über diesen Rahmen gehen?

Ich habe darüber nachgedacht, irgendwie aus dem COM-Port zu bekommen, aber ich bin mir nicht sicher, wie das geht.

Alle Ideen oder Vorschläge würden sehr geschätzt.

Bearbeiten: Hier ist mein Fortschritt.

private void test_read_Click(object sender, EventArgs e) 
    { 

     byte[] buffer = new byte[14]; 
     serialPort1.Read(buffer, 0, buffer.Length); 

     string buffer_string = BitConverter.ToString(buffer); 
     read_textbox.Text = buffer_string; 

     if (buffer[12] == 129) 
     { 
      textBox1.BackColor = System.Drawing.Color.Green; 
     } 

     if (buffer[12] == 128) 
     { 
      textBox1.BackColor = System.Drawing.Color.Red; 
     } 
    } 

Dies funktioniert, solange ich den Schalter drücke, dann klicken Sie auf die Schaltfläche in meinem Programm. Wenn ich auf die Schaltfläche in meinem Programm klicke, ohne dass eine Änderung festgestellt wird (der Schalter wurde nicht gedrückt), wartet das Programm auf eine solche Änderung, dann liest es es. Aber es liest es unvollständig. Ich bekomme einen Rahmen wie 7E 00 00 00 ... 00. Dann endet der nächste Rahmen mit 7E aus irgendeinem Grund und versetzt ihn.

Auch, wenn ich den Schalter mehrmals drücken, dann klicken Sie auf meine Schaltfläche, um zu aktualisieren, ich muss auf die Schaltfläche klicken, um bis zum letzten Frame zu gelangen.

Letztendlich möchte ich, dass das Programm die Farbe aktualisiert, wenn eine Änderung erkannt wird. Nicht durch einen manuellen Knopfdruck, um zu überprüfen, noch durch einen While-Loop, der unendlich viele unnötige Ressourcen verbraucht.

Die Byte/Frames haben immer eine feste Größe.

Jede Eingabe wird sehr geschätzt.

Antwort

0

Sie müssen ein wenig mehr Parsing der Frames machen. Das XBee-Modul generiert andere Rahmentypen, Sie müssen also nach dem 0x7E-Start des Frames Ausschau halten, die Frame-Länge und den Rahmentyp analysieren und wahrscheinlich sogar die Prüfsumme verifizieren, bevor Sie die Daten verarbeiten.

Es sollte eine serielle API zum Öffnen des seriellen Ports mit einer bestimmten Baudrate und zum Lesen/Schreiben von Zeichen vorhanden sein. Ich habe es in C als Teil einer Open Source library ich für die Schnittstelle mit XBee-Modulen erstellt getan. Wenn Sie nichts in den C# -Dokumenten für serielle Anschlüsse finden können, können Sie möglicherweise die Win32-API verwenden, die ich verwende (siehe xbee_serial.c).

Update:

In einer typischen Installation, halten Sie einen Puffer mit Teilrahmen, bis Sie einen kompletten Rahmen für die Verarbeitung haben. Rufen Sie serialPort1.Read() regelmäßig auf (alle 100 ms - hängt davon ab, wie schnell Sie reagieren möchten) und fügen Sie Bytes zum Puffer hinzu. Es gibt wahrscheinlich die Anzahl der tatsächlich gelesenen Bytes zurück, so dass Sie verfolgen können, wo Sie sich im Puffer befinden.

Sobald Sie einen kompletten Rahmen haben, können Sie es dann auf Ihre Funktion Hand ab, die sie analysiert und wirkt auf den Inhalt.

+0

Vielen Dank. Ich benutzte eine Funktion serialPort1.Read und speicherte sie in einem Byte-Array und wies sie einem Tastendruck zu. Das Problem dabei ist, dass jedes Mal, wenn ich den Knopf drücke, ein neuer Rahmen erwartet wird und wenn es keinen neuen Rahmen gibt, wartet die Anwendung auf einen neuen Rahmen. Der neue Rahmen wird dann unvollständig gelesen, und ich bekomme 7E 00 ... 00, und das versetzt den Rahmen für die folgenden Druckvorgänge, selbst wenn ein neuer Rahmen vorhanden ist. Ich kann es besser mit einer neuen Frage erklären, aber hast du eine Ahnung, was los ist? Ich würde eine Verzögerung dafür wünschen, damit es den vollen Rahmen liest. – KermitLover

+0

Ich habe meine Frage aktualisiert. – KermitLover

+0

Und ich habe meine Antwort aktualisiert. Bei Stack Overflow ist es normalerweise besser, eine neue Frage zu stellen, wenn Sie viel von der ursprünglichen Frage abweichen. Die Leute sehen es vielleicht nicht, wenn sie sehen, dass es bereits eine akzeptierte Antwort darauf gibt. – tomlogic