aiuto: if() + valori esadecimali

Ho un array di 8 char, vorrei eseguire tale condizione:

if( buf[0] == 0x7){
     if( buf[1] == 0x0 ){
       if( buf[2] == 0x42){
         if( buf[3] == 0x30){
            Serial.print( buf[ 0 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 1 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 2 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 3 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 4 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 5 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 6 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 7 ],DEC);
            Serial.print(" ");
           
            Serial.println();
         }
       }
     }
   }

Come mai non funziona? forse gli hex vanno gestiti diversamente?

Grazie mille!!!

Solita domanda: che vuol dire "non funziona"? Scrive le previsioni del meteo o gli orari di partenza del Pendolino? XD

In effetti e' molto generico :D

Allora, se io avvio questo codice

Serial.print( buf[ 0 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 1 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 2 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 3 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 4 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 5 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 6 ],DEC);
            Serial.print(" ");
            Serial.print( buf[ 7 ],DEC);
            Serial.print(" ");

mi stampa delle stringhe di 8 char (convertite nella stampa in decimale).

Io però voglio stampare solo quelle il cui valore di buf[0] è 7 (anche se le condizioni riguardano gli altri 3 bit, ma risolverne una già basta). come fare? Con il codice che ho postato prima non ottengo ciò che voglio

Usare un esadecimale o un decimale è la stessa cosa, in un confronto. Perché poi il compilatore ti trasforma tutto comunque in binario per scrivere sull'Atmega. Quindi scrivere if( buf[0] == 0x7) oppure if (buf[0] == 7) è la stessa. Forse non esegue il codice perché qualcuno dei test dà risultato negativo.

le prove le faccio lasciando attivo solo il primo test, gli altri li ho commentati.

In pratica, se faccio

Serial.print(buf[0], HEX), ottengo a video, i vari valori numerici,e ogni tanto anche 7

Se invece faccio if( buf[0] == 0x7){ etc etc non entro mai dentro la condizione (qualche 7 capita per forza di tanto in tanto)

Aspetta un attimo. Hai detto “ho un array di 8 char”: perché usi il char?
Il char tratta i caratteri, non i numeri. Se leggi ad esempio un valore su una seriale e lo metti in un char, in lettura ottieni il carattere corrispondente al codice ASCII 7, non il valore $07.
Usa un tipo byte se devi memorizzare dei valori.

Mi si sono imbattuto anch’io in questo problema.

il fatto e' che sono valori che prendo dalla usb (uso l'usb host shield), e la funzione "preleva" mi costringe a passare un bufer di char!!

per cui o char, o char... :D

E allora prevedi nel tuo codice questa cosa perché altrimenti non ne esci (IMHO).

:D :D

Dovrei modificare delle librerie (per le mie conoscenze) troppo assurde!

Mi ci sbattero' ancora la testa..

uhmm mi sa che stai confondando il valore ascii con il valore numerico... per esempio il char '7' corrisponde al numero 55, in hex: 0x37 http://www.asciitable.com/

oppure cambi l'if in

if( buf[0] == '7'){

Pensavo di non fare questo tipo di confusione...

Allora, se faccio Serial.print(buf[ 0 ],DEC ) e mi viene stampato 7, a cosa si riferisce? non penso al carattere '7', bensì al valore ascii...

No?

Uhm, forse ho risolto. Se utilizzo questa condizione:

(( buf[0] ^ 0x07) == 0)

ottengo il risultato che voglio, applicando l'XOR

prova a stampare il valore con una serial.println(valore, HEX);

Mi da il corrispettivo in esadecimale che nel caso di 7 è sempre 7...

Non ho adesso l'Arduino sotto mano per fare una prova ma il Reference parla chiaro:

A data type that takes up 1 byte of memory that stores a character value. Character literals are written in single quotes, like this: 'A' (for multiple characters - strings - use double quotes: "ABC"). Characters are stored as numbers however. You can see the specific encoding in the ASCII chart. This means that it is possible to do arithmetic on characters, in which the ASCII value of the character is used (e.g. 'A' + 1 has the value 66, since the ASCII value of the capital letter A is 65). See Serial.println reference for more on how characters are translated to numbers.

Quindi un char è la rappresentazione ASCII di un carattere. Prova usando if ( int()buf(x) == 7) e vedi cosa succede. Forzandolo cioè a Integer.

basta convertire da car a int con la fuzione int(array[])

in pratica il if sará: if(int(buf[0]) == 7 ) { etc etc

annotazione: se hai un numero di piú cifre che sono in una stringa devi aggiungere un zero finale e convertire con variabile = atof(stringa) variabile deve essere un long

Ciao Uwe

se lo forzi ad integer ottieni il valore nella tabella ascii corrispondente (55) però dipende, magari è numericamente un 7, quindi se lo stampi come se fosse un char otterresti "bell", che penso sia il suono del cicalino

purtroppo prima di stasera non potrò fare ulteriori prove, ma qualcuna l'avevo già fatta:

dal numero 32 in giù non c'e' un relativo carattere che possa essere rappresentato. Infati si inizia con lo spazio che parte dal numero 32, quindi i codici inferiori non possono essere trattati come caratteri...

Ho fatto già questa prova: if ( int()buf(x) == 7) , ma non produco risultati sperati... ho fatto anche le seguenti prove senza esito:

if ( buf(x) == '7') if ( buf(x) == char(7))

Ho provato pure questo:

Serial.print(char(buf(x)) e non stampa nulla (spazio vuoto), possibilmente perche' non esiste un carattere relativo al numero 7.

Le stringhe sono similiari a ciò che segue:

1 FFFFFFFF 0 30 63 1 0 0 7 0 42 30 FFFFFF98 0 0 0 5 30 0 30 6A 1 0 0 1 FFFFFFFF 0 30 6A 1 0 0 7 0 42 30 FFFFFF98 0 0 0 5 30 0 30 6A 1 0 0 1 FFFFFFFF 0 30 6A 1 0 0 7 0 42 30 FFFFFF98 0 0 0 5 30 0 30 6A 1 0 0 1 FFFFFFFF 0 30 6A 1 0 0

E così via. Ovviamente sono in esadecimale...

Che ne dite di questa discussione?

http://arduino.cc/forum/index.php/topic,51377.0.html

Anche io ho delle stringhe in quel modo, anche se non dovrebbero essere così!!