Hallo,
um die Ausgaben eines Nextiondisplays auszuwerten habe ich ein Abfrageprogramm geschrieben.
In Zeile 69 wird anhand von Bit 6 des Befehlsbytes geprüft, ob Datenbytes anhängig sind.
Obwohl die Ausgabe des Vergleiches in Zeile 67 immer 64 ausgibt (wie es sein sollte) funktioniert die gleiche if-Abfrage nicht.
Die Datenbytes werden nur eingelesen wenn *Bit 0 des Befehlsbytes eins ist (siehe Ausgabe des Terminalprogramms, es wurden 0xC0 bis 0xC5 an das Programm gesendet.
Obwohl ich den Zusammenhang sehe ist mir die Wirkungsweise schleierhaft, was übersehe ich hier?
Die deb-Anweisungen sind lediglich serielle Ausgaben zu debuggen, ich habe sie aber mal drin gelassen, da man so die Ausgaben nachvollziehen kann ....
Programm:
#define DEBUG_ON //Debugger ist aktiviert (Definition muss vor der include-Anweisung stehen!)
#include <MyDebug.h>
byte byte_daten1;
byte byte_daten2;
byte byte_befehl;
byte befehlscode;
byte seite;
byte timer_pumpe_5;
byte timer_pumpe_30;
bool pumpe_on = false;
bool status_automatik_fenster;
byte temp_schwelle;
byte fenster_soll;
int loopschleife = 1;
void setup() {
Serial.begin(115200);
Serial.println("Setup");
}
void loop() {
Serial.println(loopschleife);
display_einlesen();
delay(5000);
loopschleife = loopschleife + 1;
}
void display_einlesen() {
byte_befehl = 0;
byte_daten1 = 0;
byte_daten2 = 0;
if (Serial.available() > 0) { // neue Daten vom Display?
debm("neue Daten");
byte_befehl = Serial.read();
}
else {
debm("keine neuen Daten");
return;
}
debv("Befehlsbyte ist: ", byte_befehl);
if (byte_befehl < 128) { // kein Befefehlsbyte (Bit 7 = 1)
debm("Fehler Befehlsbyte");
return;
}
debv("Datenbytes? ", byte_befehl & 64);
if (byte_befehl & 64 == 64) { // zwei anhängende Datenbytes (Bit 6 = 1)
debm("Datenbytes einlesen");
byte_daten1 = Serial.read(); // Datenbytes lesen
byte_daten2 = Serial.read();
debv("Byte 1", byte_daten1);
debv("Byte 2", byte_daten2);
}
befehlscode = byte_befehl & 63; // Befehlscode (Bit 0-6) extrahieren
debv("Befehlscode ist ", befehlscode);
switch (befehlscode) { // Befehle abarbeiten
case 0:
debm("Seite 0, keine Daten");
seite = 0;
break;
case 1:
debm("Seitenwechsel");
seite = byte_daten1;
break;
case 2:
debm("Rücksprung Pumpensteuerung");
timer_pumpe_5 = byte_daten1;
timer_pumpe_30 = byte_daten2;
// Werte an Pumpensteuerung übergeben
// Pumpe ausschalten
seite = 0;
break;
case 3:
debm("Pumpe umstellen");
if (pumpe_on == true) {
// Pumpe aus
}
// Pumpe ein
break;
case 4:
debm("Rücksprung Fenstersteuerung");
if (byte_daten1 > 63) { // Automatikmode (Bit 6 = 1), temp_schwelle
debm("Automatikmode ein");
status_automatik_fenster = true;
temp_schwelle = byte_daten1 & 127;
}
debm("Automatikmode aus");
status_automatik_fenster = false;
fenster_soll = byte_daten1 & 127;
seite = 0;
break;
}
}
Terminalausgabe, man sieht bei allen ungeraden Befehlsbytes die Daten"lesung" ..
DEBUG: Marker keine neuen Daten
8
DEBUG: Marker keine neuen Daten9
DEBUG: Marker neue DatenDEBUG: Befehlsbyte ist: = 192
DEBUG: Datenbytes? = 64
DEBUG: Befehlscode ist = 0
DEBUG: Marker Seite 0, keine Daten
10
DEBUG: Marker neue DatenDEBUG: Befehlsbyte ist: = 193
DEBUG: Datenbytes? = 64
DEBUG: Marker Datenbytes einlesen
DEBUG: Byte 1 = 255
DEBUG: Byte 2 = 255
DEBUG: Befehlscode ist = 1
DEBUG: Marker Seitenwechsel
11
DEBUG: Marker neue Daten>DEBUG: Befehlsbyte ist: = 194
DEBUG: Datenbytes? = 64
DEBUG: Befehlscode ist = 2
DEBUG: Marker Rücksprung Pumpensteuerung
12
DEBUG: Marker neue DatenDEBUG: Befehlsbyte ist: = 195
DEBUG: Datenbytes? = 64
DEBUG: Marker Datenbytes einlesen
DEBUG: Byte 1 = 255
DEBUG: Byte 2 = 255
DEBUG: Befehlscode ist = 3
DEBUG: Marker Pumpe umstellen
13
DEBUG: Marker neue DatenDEBUG: Befehlsbyte ist: = 196
DEBUG: Datenbytes? = 64
DEBUG: Befehlscode ist = 4
DEBUG: Marker Rücksprung Fenstersteuerung
DEBUG: Marker Automatikmode aus
14
DEBUG: Marker neue DatenDEBUG: Befehlsbyte ist: = 197
DEBUG: Datenbytes? = 64
DEBUG: Marker Datenbytes einlesen
DEBUG: Byte 1 = 255
DEBUG: Byte 2 = 255
DEBUG: Befehlscode ist = 5
cu