info arduino e visual basic

Colgo la palla al balzo per spiegare qualcosa su serialEvent().

Questa funzione viene chiamata (non sempre) ad ogni ciclo di loop, più precisamente al termine della funzione loop().

Qui il codice da main.cpp

	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}

Ora se andiamo a vedere cosa fa la funzione serialEventRun capiamo qualcosa in più.
La funzione in questione si trova in HardwareSerial.cpp qui un estratto:

void serialEventRun(void)
{
#if defined(HAVE_HWSERIAL0)
  if (Serial0_available && serialEvent && Serial0_available()) serialEvent();
#endif
#if defined(HAVE_HWSERIAL1)
  if (Serial1_available && serialEvent1 && Serial1_available()) serialEvent1();
#endif

Pare evidente che serialEvent() viene chiamata solo se la condizione seguente risulta vera:

Serial0_available && serialEvent0 && Serial0_available()

Ora la funzione Serial0_available() restituisce un bool e la posto per intero di seguito:

bool Serial0_available() {
  return Serial.available();
}

Quindi riassumendo serialEvent() viene chiamata solo se ci sono dati nel buffer, se il buffer è vuoto non viene chiamata.

Ora tutto questo il reference non lo mostra e mostra un uso che può essere frainteso, nel senso che l'esempio è fatto in modo da richiedere il while (Serial.available()) che non sempre è necessario.

Ad esempio non è necessario quando vogliamo leggere un carattere da seriale e subito dopo abbandonare la funzione serialEvent().

Nel caso richiesto da @fabiano2017 il while (Serial.available()) non è necessario, per cui il codice di @Standardoil diventa come segue:

void serialEvent() {
 
    stato = Serial.read();
    switch (stato) {
      case 'A':
        digitalWrite(led,HIGH);
        break;
      case 'S':
        digitalWrite(led,LOW);
        break;
    }

}

Inoltre se non ci sono dati nel buffer la Serial.read() restituisce -1.

Aggiungo che l'esempio nel reference non lo userei neanche se dovessi collezionare i caratteri e inserirli in un vettore, questo perché durante il tempo che colleziono i caratteri il codice dentro la loop() non viene eseguito.

Ciao.