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.
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
Ich habe meine Frage aktualisiert. – KermitLover
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