Modificare libreria

Salve, sto utilizzando una libreria che mi permette l'invio e la ricezione di dati con l'utilizzo di due moduli can bus. Il problema è che riesco ad inviare ciò che voglio ma ricevo in un formato standard deciso evidentemete dalla libreria, per esempio :

invio -------> 0200A000 e ricevo ------> 02000000....Si perde delle informazioni

E noi cosa possiamo rispondere se ... NON ci dai almeno un link alla libreria che usi e un indicazione sul metodo chiamato ? ? ? :o

Guglielmo

gpb01:
E noi cosa possiamo rispondere se ... NON ci dai almeno un link alla libreria che usi e un indicazione sul metodo chiamato

Il codice di ricezione è

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg;
MCP2515 mcp2515(10);


void setup() {
  Serial.begin(115200);
  SPI.begin();
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
  mcp2515.setNormalMode();
  
  //Serial.println("------- CAN Read ----------");
  //Serial.println("ID  DLC   DATA");
}

void loop() {

  
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
      
    Serial.print(canMsg.can_id, HEX); // print ID HEX
   // Serial.print(" "); 
    String dlc = "#";
    Serial.print(dlc);
   // Serial.print(canMsg.can_dlc); // print DLC  HEX
    
  //  Serial.print(" ");
   // for (int i = 0; i<sizeof(canMsg.can_dlc); i++) 
    int dim = sizeof(canMsg.data);
    Serial.print ("valore dim vett ");
    Serial.println (dim);
    for (int i = 0; i<dim; i++)  {  // print the data
        
      Serial.print(canMsg.data[i], HEX);    //HEX

    }

    Serial.println();      
  }
 

}

Se invio 188#0200 ricevo 188#02000000. Se invio 188#02000B ricevo 188#02000000. Se invio 188#020B000B00 ricevo 020B0000

Guarda che manca ancora il link alla tua esatta libreria (te l'ha già chiesto Guglielmo...), perché ne esiste più di una...

Per dire, c'è una CAN-Bus_Shield di Sparkfun nella quale però non c'è la definizione di quella classe MCP2515 né ci sono quei metodi.

Scusa ma se ti si chiede di postare non solo il tuo codice ma anche la libreria, ci sarà un motivo, non ti pare?... :wink:

Si scusate ho capito io male, ho risolto il problema che vi ho espresso. La fonte della libreria è :GitHub - autowp/arduino-mcp2515: Arduino MCP2515 CAN interface library. Il problema è che vorrei ricevere un pacchetto dati superiore di 8

Se parli del frame, potrebbe bastare forse modificare il file can.h:

...
/* CAN payload length and DLC definitions according to ISO 11898-1 */
#define CAN_MAX_DLC 8
#define CAN_MAX_DLEN 8

struct can_frame {
    canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
    __u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
    __u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
};

modificando la #define CAN_MAX_DLEN.

Ma per quanto ne so (ho iniziato a studiarmelo un poco visto che anche io ho un CANBUS Shield e volevo provare durante le ferie ad implementarmi un logger) lo standard è di 8 byte, forse tu stai usando CAN FD?

EDIT: e comunque dici che hai risolto, ma a me pare lo stesso problema in realtà...

Come fai a modificare la lunghezza? :o Il campo "data Field" è di 64 bit ed il campo "control Field" contiene 4 bit per indicare quanti bytes sono nel "dataField" con una codifica che permette da 0 a 8 bytes ...

Almeno nel CAN standard ... poi se usi CAN FD è un'altro discorso ... e tocca vedere l'hardware ... ::slight_smile:

Guglielmo

gpb01:
Almeno nel CAN standard ... poi se ci sono versioni estese non so ... ::slight_smile:

Ehm si, lo avevo scritto, si chiama CAN FD... :wink:

EDIT:
While classic CAN has the capacity to hold 8 bytes of data within the CAN-frame, CAN FD can hold up to 64.

Ma c'è da capire se QUELLA libreria sia in grado di gestire il CAN FD (sempre se il veicolo usa questo standard, cosa che deve verificare l'OP)

docdoc:
EDIT: e comunque dici che hai risolto, ma a me pare lo stesso problema in realtà...

Ho risolto il problema relativo al fatto che se invio 4 byte ne arrivano 4 dall'altra parte. Il problema nasce se ne invio tipo 244#000000015D visualizzo solo i primi 8

Il chip MCP2515 e il suo datasheet parlano chiaro. Ci sono solo 4 bit per specificare il datalen, ma il massimo è 8 byte anche quando accendi tutti e 4 i bit (cioè 15).

Vedi pagina 22, Register 3-7.

Tieni conto che sulle auto già da un po di tempo (almeno da quando esistono i cortex M-0) lo stack CAN è interno alla MCU per cui il chip 2515 non serve più.

Ciao.

Maurotec:
Ci sono solo 4 bit per specificare il datalen, ma il massimo è 8 byte anche quando accendi tutti e 4 i bit (cioè 15).
Vedi pagina 22, Register 3-7.
Tieni conto che sulle auto già da un po di tempo (almeno da quando esistono i cortex M-0) lo stack CAN è interno alla MCU per cui il chip 2515 non serve più.

Una cosa che non mi è chiara. Il can bus "normale" ha un campo dati di massimo 8 byte, mentre il can bus fd utilizza un campo dati di massimo 64 byte. Entrambi i can bus hanno la possibilità di avere il campo identificatore sia da 11 bit che da 29 bit. Ora utilizzando lo shield e inviando delle informazioni del tipo 188#02000000 vuol dire che il campo dati , cioè il payload è di 8 byte ?

188#02000000

Cioè?
0x18 can_id
0x8 can_dlc
02000000 can_data

can_data sta in 4 byte (32-bit)

mentre 02000000000000 64-bit

Ora cosa succede se dlc = 8 e il can_data contiene solo 4 byte?
Non lo so.

Ciao.