1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| const byte enTete[] = {0xDE, 0xAD, 0xBE, 0xEF}; // DEADBEEF
const byte tailleEnTete = sizeof enTete;
struct __attribute__((packed)) t_payload {
int16_t data[14];
byte endMarker;
};
bool gotHeader() {
static byte position = 0;
int r = Serial.read();
if (r != -1) { // -1 veut dire rien à lire, plus rapide que d'appeler available()
if (r == enTete[position]) {
position++;
if (position >= tailleEnTete) {
position = 0; // pour la prochaine fois
return true;
}
} else {
position = 0; // mauvaise séquence, on recommence
return false;
}
}
return false; // rien de dispo à lire
}
void setup() {
Serial.begin(115200); Serial.println();
}
void loop() {
if (gotHeader()) {
// on a bien reçu le header
byte buffer[sizeof(t_payload)];
t_payload maStructure;
while (Serial.peek() == -1) ; // on attend de recevoir au moins un octet et on demande d'en lire le nombre adéquat pour la structure
if (Serial.readBytes(buffer, sizeof(t_payload)) == sizeof(t_payload)) { // si on a bien reçu tous les octets avant le timeout
memcpy(&maStructure, &buffer, sizeof(t_payload)); // on initialise la structure avec le contenu du buffer (éviter les cast sauvages en C++)
// ici on a les données reçues dans la structure
// ...
} else {
// Okay, Houston, I believe we've had a problem here
}
}
} |
Partager