Ciao a tutti.
Sono 2 giorni che cerco di venirne a capo ma proprio non ci riesco. Alcuni argomenti del C mi sono sempre rimasti indigesti e adesso ne pago le conseguenze...
Faccio una piccola premessa per inquadrare il problema:
voglio trasmettere dei dati tra 2 arduino e sto facendo degli esperimenti con i moduli HC12. L'idea è quella di crearmi 2 funzioni (una per trasmettere e una per ricevere) da poter utilizzare alla bisogna in vari progetti.
Da qui l'idea di infilare i dati in una struct e inviarla un byte alla volta come fosse un "array". In questo modo anche se cambia la struct la funzione di invio e ricezione rimane la stessa.
In pratica ho pensato ad una struttura tipo
typedef struct {
uint32_t idmsg;
uint8_t destinatario;
uint32_t valore1;
uint32_t valore2;
// ecc
} t_dati;
#define DIMDATI (sizeof(t_dati))
typedef struct {
t_dati dati;
uint32_t crc;
} t_pack;
#define DIMPACK (sizeof(t_pack))
t_pack pacchetto;
Quindi inserisco i miei dati dentro pacchetto.dati poi calcolo il CRC e poi invio il tutto.
La funzione che calcola il CRC è questa (sempre grazie a Guglielmo per averla condivisa in altre discussioni)
unsigned long calc_crc32(unsigned char* buf, unsigned int len)
{
unsigned long crc;
unsigned int i;
crc = 0xffffffff;
for (i = 0; i < len; i++)
#if defined(__SAM3X8E__)
crc = ((crc >> 8) & 0x00ffffff) ^ crctab32[(crc ^ *buf++) & 0xff];
#else
crc = ((crc >> 8) & 0x00ffffff) ^ pgm_read_dword_near(&crctab32[(crc ^ *buf++) & 0xff]);
#endif
return (crc ^ 0xffffffff);
}
Nella mia idea vorrei poter chiamare la funzione del CRC più o meno così:
pacchetto.crc = calc_crc32(pacchetto.dati, DIMDATI);
e inviare i dati più o meno così:
for (byte i=0; i < DIMPACK; i++) {
HC12.write(pacchetto[i]);
}
So che scritto così il codice non funziona, è solo per farvi capire.
Come dovrei passare il primo parametro alla funzione CRC?
Come posso accedere alla struttura pacchetto nel for per inviare un byte alla volta?
E' venuto un papiro... scusate.
Grazie in anticipo a chi avrà tempo e voglia di leggere tutto il post.
EDIT: ho dimenticato di scrivere che so che il tutto è fattibile con delle union.
Ho provato e funziona, ma si complica la struttura. Se ci fosse il modo di farlo senza union sarebbe più semplice.