CAN-bus R4 Minima

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?

  1. 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?

  1. 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"

1 Like