Ciao,
ho cercato di riassumere nel titolo la mia esigenza ma adesso cerco di spiegarla bene:
Ricevo sulla seriale da un dispositivo che legge dei tag RFID una serie di caratteri codificati in ascii come questo:
230303336353931333239DA3
che si capisce meglio così:
2 30 30 33 36 35 39 31 33 32 39 D A 3
Tralasciando i caratteri di inizio, fine CR e LF (2,3 D, A) il dato è:
30 30 33 36 35 39 31 33 32 39
che convertito secondo la tabella è:
0 0 3 6 5 9 1 3 2 9
ora se lo converto in HEX ottengo:
22E56E1 diviso in byte:
02 2E 56 E1
Dulcis in fundo devo invertire i byte perchè il codice del tag è:
E1 56 2E 02, che è quello che mi aspetto
Vorrei capire se c'è un metodo più veloce e più bello per ottenere il risultato finale o se devo fare uno alla volta i passaggi descritti sopra.
Sembri indicare che il 3 fa parte del trailer con CR e LF. Non fa invece parte del header?
0x03 0x02 ....(dati)... CR LF
Il Arduino è little endian, quindi se converti il numero che hai ricevuto in un unsigned long, verrà memorizzato in memoria con il byte meno significativo prima.
Ciao,
ti confermo che la sintassi è come l'ho descritta, il micro la espone proprio così ad ogni lettura.
Grazie molte per il codice che hai postato, con le opportune modifiche si adatta perfettamente a quello che mi serve.
E grazie anche per la dritta sul insigned long, non lo sapevo.
In questo modo dovrei riuscire a fare tutto...ora ci lavoro!
Ciao,
trovo una notevole difficoltà a trasformare i byte 0 0 3 6 5 9 1 3 2 9
nel numero decimale 36591329.
Ho provato con una formula matematica, ma evidentemente l'errore è concettuale, perchè il singolo byte non posso utilizzarlo come se fosse un numero.
Grandissimo!,
ammetto che non ho dimestichezza con la tabella ascii, ma con il tuo suggerimento ho risolto: praticamente prima di elevare alla potenza tolgo al valore del byte la "distanza" 48.
Ok...un passo alla volta..
Ora ho il mio numero intero 36591329 che, se lo visualizzo in Hex mi da correttamente 22E56E1(che ho messo nella variabile" pluto")
Ho provato a inserire una variabile del tipo
Ci sono diversi modi per farlo, ma in realtà non c'è una vera conversione da tipo uint32_t e tipo array. Il modo consigliato è quello di fare ricorso alle union. Io non le ho usate le union e al loro posto ho trasformato/convertito un indirizzo di memoria in un puntatore a tipo uint8_t.
La conversione è banale:
uint8_t *pointer = (uint8_t*)&nomeVariabile;
Da adesso pointer può essere usato con gli indici per accedere al prossimo byte.
Certo che non è facile da spiegare come funziona, perché appena lo intuisci ti si apre una nuova dimensione.
Posso solo consigliarti questo articolo che ho scritto nel mio blog:
Esatto, mi ero accorto della mancanza dell'asterisco ma non ho avuto il tempo di modificarlo e poi l'ho dimenticato. Oggi mi sono ricordato e ho editato il post.
Funziona!!
Innanzitutto grazie a tutti e soprattutto a Maurotec per aver centrato al volo le mie esigenze.
poi...
Ho cercato di capire il funzionamento dei puntatori prima di implementare il loro utilizzo nel codice, e quindi:
ho capito cosa sono e come si utilizzano con * e &
.....non mi è chiaro però quando e perchè usarli...dovrò approfondire bene.
Posso sintetizzare il perché, mentre per il quando è bene non sintetizzare. In C (senza ++) non c'è altra scelta che usare i puntatori.
Supponi di avere un oggetto (un simbolo) mioOggetto che contiene tante informazioni e diciamo che è grande 64-byte. Passare come argomento questo oggetto ad una funzione per valore a come conseguenza la copia locale dell'oggetto, all'interno della funzione non operi su mioOggetto ma su una copia locale. La copia consuma risorse e tempo CPU. Mentre se alla funzione passi come argomento un puntatore a mioOggetto viene fatta copia locale del puntatore che è grande 16-bit. Tramite il puntatore da dentro la funzione operi su mioOggetto.
Poi è l'unico modo per accedere alla ram in modo arbitrario.