Nel senso che posso usare sempre questo invece di aprirne altri ?
Si, decidi tu cosa fare. L'argomento di base è comunque il can bus. Puoi anche decidere di aprire un altro thread come hai fatto per la conversione da Hex to Int la quale può tornare utile ad altri, ma chi segue questo thread trova comunque comodo avere un link al thread Hex to Int che puoi aggiungere nel primo tuo post di questo thread.
Qualcosa del tipo:
Libreria can bus: link
Moduli can bus: link
ecc...
ho già fatto questa prova e non funziona niente. Forse con il candump devo stare attento ai caratteri di fine linea. Proverò con un file.
Per forza di cose arduino che riceve le stringhe attraverso,
candump vcan0 > /dev/ttyACM0
deve potere distinguere un messaggio dall'altro. Ho dato uno sguardo veloce al sorgente di candump e credo che ogni messaggio termina con '\n' NewLine (o LineFeed come riportato nella tabella ASCII).
Proviamo arduino da seriale riceve l'output di candump. Come riferimento prendo le prime 3 stringhe:
(0) 166#D0320018
(1) 158#0000000000000019
(2) 161#000005500108001C
Il messaggio "0" ha can_id 0x166, il can_data è 0xD0320018, mentre can_dlc deve essere dedotto contando i caratteri del can_data che sono 8 digit quindi 8/2 = 4 byte.
Decodificata questa stringa si deve riempire il frame
struct can_frame {
uint32_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
uint8_t can_dlc;
uint8_t data[8];
};
struct can_frame frame;
frame.can_id = 0x166;
frame.can_dlc = 0x04;
frame.data[0] = 0xD0;
frame.data[1] = 0x32;
frame.data[2] = 0x00;
frame.data[3] = 0x18;
Se il can_id del messaggio è composta da 8 digit si tratta di Extended Frame e si dovrà riempire il can_id come riportato qui.
frame.can_id = 0x12345678 | CAN_EFF_FLAG;
Ho scritto codice di test C per essere eseguito sul PC dove dispongo della funzione strtoll che non c'è su arduino e
non ho ancora risolto. Se campo data è composto da 16 digit can_dlc sarà 16/2 = 8 byte, si spezzano in due
per avere 4 byte da dare in pasto a strtol (due volte), quindi 64 bit si dividono in MSBdata di 32bit e LSBdata di 32bit,
con cui riempire frame.data. Tornerebbe utile una union su frame.data in modo che possa accettare direttamente MSB e LSB.
Riepita frame. si può spedire il messaggio, che viene spedito tramite MCP sul BUS fisico all'altro MCP ricevente.
Il MCP ricevente solleva il PIN INT per comunicare alla MCU328 che sono arrivati dati e questo li legge interrogando MCP tramite SPI, letto il messaggio lo stampa via seriale Serial.
Ciao.