Seriamente?
ti rendi conto che hai commesso ameno tre errori, 2 gravi?
se qualcuno segue questi tuoi "esempi risolutivi" va semplicemente a fare danni al suo programma
come tu te ne stai facendo adesso
non ci credi?
- quello non grave:
static uint32_t const CAN_ID = 0x01; //Indirizzo CAN, cambiare a piacimento
sai cosa vuol dire una dichiarazione static nel preambolo e non in una funzione?
- il primo dei gravi:
uint8_t const msg_data[8] = {};
una dichiarazione di costante "vuota"?
3) certo, perché qui si "scrive" la costante
memcpy((void*)(msg_data), &msg_cnt, sizeof(msg_cnt));
senza assicurarsi che sia stata "pulita" (si tratta di una variabile "locale", e questo per buona grazia non lo conto come errore)
4) e qui poi ci si rende conto che non si tratta di dimenticanze, ma proprio errori in pieno
char readCanChar(int address) {
if (CAN.available()) {
CanMsg const msg = CAN.read();
const uint8_t* buffer = msg.data;
char res;
memcpy(&res, buffer, sizeof(buffer));
if (msg.getStandardId() == address) {
return res;
}
}
}
di nuovo buffer è costante, ma scritto, di nuovo senza controllare ne che la sua dimensione sia corretta ne che sia stato svuotato
ma lo si assegna alla memoria indirizzata da una variabile carattere (1 byte, scritti 8, 7 sovrascrittti da chissà cosa)
inoltre non vedo ne un controllo di disponibilità CAN.available(), consigliato negli esempi ne un abbozzo di sincronismo, nulla garantisce che mentre trasmettiamo un float il ricevitore si aspetti un int
tutto questo non è ne buona ne pessima programmazione, è semplicemente programmazione pericolosa
segnalarlo come "soluzione" è pericoloso per i niubbi
io proporrei ai moderatori di togliere il flag "soluzione"