bool ottieniCodice(byte* payload) {
constexpr byte lunghezzaPayload = 10;
constexpr byte intestazione1 = 'A'; // 0x03; (Usare 'A' per testare nel simulatore)
constexpr byte intestazione2 = 'B'; // 0x02; (Usare 'B' per testare nel simulatore)
static byte posizione = 0;
static char txtCodice[lunghezzaPayload + 1];
static enum : byte {OTTIENI3, OTTIENI2, OTTIENI_CODICE, OTTIENI_CR, OTTIENI_LF} passo = OTTIENI3;
if (Serial.available() == 0) return false;
int r = Serial.read();
bool codicePronto = false;
switch (passo) {
case OTTIENI3:
if (r == intestazione1) passo = OTTIENI2;
break;
case OTTIENI2:
if (r == intestazione2)
passo = OTTIENI_CODICE;
else
passo = OTTIENI3;
break;
case OTTIENI_CODICE:
if (r >= '0' && r <= '9') {
txtCodice[posizione++] = r;
txtCodice[posizione] = '\0';
if (posizione >= lunghezzaPayload) {
posizione = 0;
passo = OTTIENI_CR;
}
} else {
posizione = 0;
passo = OTTIENI3;
}
break;
case OTTIENI_CR:
if (r == '\r')
passo = OTTIENI_LF;
else
passo = OTTIENI3;
break;
case OTTIENI_LF:
if (r == '\n') {
Serial.print("Ricevuto: "); Serial.println(txtCodice);
uint32_t converti = strtoul(txtCodice, nullptr, 10);
memcpy(payload, &converti, sizeof converti);
codicePronto = true;
}
passo = OTTIENI3;
break;
}
return codicePronto;
}
void setup() {
Serial.begin(115200);
Serial.println("Inserisci il codice");
}
void loop() {
byte codice[4];
if (ottieniCodice(codice)) {
Serial.print("Codice esadecimale: ");
for (byte i = 0; i < sizeof codice; i++) {
if (codice[i] < 0x10) Serial.write('0');
Serial.print(codice[i], HEX);
Serial.write(' ');
}
Serial.println("\nInserisci il codice");
}
}