//[START+ID]Messaggio[STOP]
// Start ricezione se c'è questa sequenza di caratteri ^^# + numero indirizzo
#define STX "^^#3"
// Stop ricezione se c'è questa sequenza di caratteri __
#define ETX '_' // STOP se 2 caratteri consecutivi
/* Stringhe di esempio:
^^#1Ciao Slave 1__ xxx ^^#3Slave 3 accendi il led__ xxx ^^#2Ciao Slave 2__
^^#3 SLave 3 spegni il led__
*/
char rxBuff[100];
uint16_t pos = 0;
enum RxState {IDLE, START_FRAME, MY_ADR, STOP_FRAME};
uint8_t rxState = IDLE;
void setup() {
pinMode(13, OUTPUT);
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println();
}
void loop() {
switch (rxState) {
case IDLE:
if(Serial.available() && Serial.find(STX)) {
rxState = START_FRAME;
Serial.print("\nStart frame");
}
break;
case START_FRAME:
while(Serial.available()) {
char ch = (char) Serial.read();
if(ch == '_' && rxBuff[pos-1] == '_') {
rxState = STOP_FRAME;
Serial.println(" - Stop frame");
// Remove stop char from buffer
rxBuff[pos -1] = '\0';
break;
}
rxBuff[pos++] = ch;
}
break;
}
if (rxState == STOP_FRAME) {
Serial.print("Questo era per me: ");
Serial.println(rxBuff);
if(strstr(rxBuff, "accendi")) {
digitalWrite(13, HIGH);
Serial.println("Accendo il led");
}
if(strstr(rxBuff, "spegni")){
digitalWrite(13, LOW);
Serial.println("Spengo il led");
}
// Reset del buffer seriale e dello stato
rxBuff[0] = '\0';
pos = 0;
rxState = IDLE;
}
}