Ethernet shield e comunicazione udp

salve a tutti :slight_smile:

Io ho il seguente programma su un arduino diciamo come Slave e riceve “accendi” e “spegni” da un master:

void loop() {
  
int NumDataRx = Udp.parsePacket();

if(NumDataRx > 0)
{
  char DatiRX[NumDataRx];

  /*Serial.print("Numero di byte da leggere: ");
  Serial.println(NumDataRx);*/


  Udp.read(DatiRX,NumDataRx);

  for(int i = 0; i < NumDataRx; i++)Serial.print(DatiRX[i]); //(iny)
  Serial.println();

  if(DatiRX == "set")   digitalWrite(8,HIGH);
  if(DatiRX == "reset") digitalWrite(8,LOW );

}
}

il mio problema è che i due if finali del programma non vengono eseguiti… ovvero il led ne si accende ne si spegne. eppure io dal monitor seriale vedo le due stringhe ricevute dal master correttamente :frowning:

MD

In C per confrontare due stringhe non puoi usare ==, devi usare strcmp(), che ritorna 0 in caso di uguaglianza.

void loop() {
  
int NumDataRx = Udp.parsePacket();

if(NumDataRx > 0)
{
  char DatiRX[NumDataRx];
  Udp.read(DatiRX,NumDataRx);

  for(int i = 0; i < NumDataRx; i++)Serial.print(DatiRX[i]); //(iny)
  Serial.println();

  if(strcmp(DatiRX,"set")==0)   digitalWrite(8,HIGH);
  if(strcmp(DatiRX,"reset")==0) digitalWrite(8,LOW );

}
}

con questa modifica non va lo stesso :frowning:

MD

Forse in coda alla stringa in input ci sono dei CR o LF? Degli "a capo", insomma. Prova così:

if(strncmp(DatiRX,"set", 3)==0)
  digitalWrite(8,HIGH);
else if(strncmp(DatiRX,"reset", 5)==0)
  digitalWrite(8,LOW );

Grazie mille SukkoPera ... ho risolto con il comando da te suggerito :)

P.S.: chiedo al brucio un'ultima cosa... come si segna un post come RISOLTO?:)

MD

Se preferisci, questa funzione toglie tutti gli a capo e/o spazi finali da una stringa:

char *strstrip (char *s) {
    for (char *c = s + strlen (s) - 1; c >= s && isspace (*c); --c)
        *c = '\0';
    return s;
}

Quanto al RISOLTO, credo che basti modificare il primo post e dovresti poter cambiare il titolo.

SukkoPera: In C per confrontare due stringhe non puoi usare ==, devi usare strcmp(), che ritorna 0 in caso di uguaglianza.

Se non sbaglio strcmp non esegue alcun controllo sulle lunghezze per cui per lui stringa e stringalunga sono uguali.

Un "trucco" per fare velocemente paragoni tra due array di char, massimo 4 caratteri sugli AVR, senza scomodare la strcmp() che è pesante da eseguire. Basta trasformare con una union i due array in due numeri long ed eseguire il paragone tra questi, il tempo di esecuzione è meno di un 1/3 di quello richiesto dalla strcmp().

zoomx: Se non sbaglio strcmp non esegue alcun controllo sulle lunghezze per cui per lui stringa e stringalunga sono uguali.

Sbagli :).

Hai ragione, la funzione a cui mi riferivo è invece strncmp che ha questo problema.

Beh oddio, non lo definirei "problema", visto che se usi strncmp() è esattamente perché vuoi fare quello ;).

L'uso della funzione strncmp() è stata la causa di un baco che anni fa permise lo sblocco delle Wii http://wiibrew.org/wiki/Signing_bug