User Tools

Site Tools


arduino:wio-canprot-framing-fr

Trame CAN ASCII

Format ASCII

Communication à travers le port série ou TCP/IP la trame ASCII est utilisée.

:XhhhhhhhhNd0d1d2d3d4d5d6d7;\n

:X       -> X=étendu S=court (début de la trame CAN)
hhhhhhhh -> ID (4 octets étendus et 2 octets courts)
N        -> N=normal R=RTR
d0-d7    -> Donnée (De zéro à huit octets de données)
;        -> fin de la trame (demi colonne)
\n       -> saut de ligne

Le DLC est calculé par le nombre d'octets de données suivant le type 'N' ou 'R'.
Les identifiants courts ne sont pas utilisés dans le protocole RCAN.

Example

:X04070101N112233445566;
ID 0x4711
Type Normal
Data 0x11 0x22 0x33 0x44 0x55 0x66
DLC 6


Exemple de Code

Encoder la trame ASCII

int rcan_makeExtASCIIFrame(char* frame, int prio, byte* databytes, int datalen, long id, Boolean linefeed ) {
  int i = 0;
 
  StrOp.fmtb( (char*)(frame+1), ":X%02X%02X%02X%02XN;%c",
      (id >> 24) & 0xFF, (id >> 16) & 0xFF, (id >> 8) & 0xFF, id & 0xFF, linefeed?'\n':'\0' );
 
  if( datalen > 0 ) {
    for( i = 0; i < datalen; i++ ) {
      // :X00080004N
      StrOp.fmtb( (char*)(frame+1+11+i*2), "%02X;%c", databytes[i], linefeed?'\n':'\0' );
    }
  }
 
  frame[0] = StrOp.len((char*)(frame+1));
 
  return frame[0];
}


Décoder la trame ASCII

static char hexb[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15};
void rcan_ASCIIFrame2CANFrame(const char* frame, iCANFrame canFrame) {
  Boolean ok = True;
  int offset = 0;
  int idh    = 0;
  int idl    = 0;
  int edh    = 0;
  int edl    = 0;
  int opc    = 0;
  int i      = 0;
  int len    = StrOp.len(frame);
 
  canFrame->flags = 0;
 
  if(frame[1] == 'X') {
    offset = 4;
    canFrame->flags = CANFLAG_EXTENDED;
    edh = mbus_HEXA2Byte(frame + 2);
    edl = mbus_HEXA2Byte(frame + 4);
    idh = mbus_HEXA2Byte(frame + 6);
    idl = mbus_HEXA2Byte(frame + 8);
  }
  else {
    idh = mbus_HEXA2Byte(frame + 2);
    idl = mbus_HEXA2Byte(frame + 4);
  }
 
  canFrame->id = (edh << 24 ) + (edl << 16 ) + (idh << 8 ) + idl;
 
  // Lookup ';' to determine the dlc.
  canFrame->dlc = 0;
  for( i = 0; i < len; i++ ) {
    if( frame[7+offset+ i*2 + 2] == ';' ) {
      canFrame->dlc = i + 1;
      break;
    }
  }
 
  for( i = 0; i < canFrame->dlc; i++ ) {
    canFrame->data[i] = (hexb[frame[7 + offset + 2 * i] - 0x30] << 4) + hexb[frame[7 + offset + 2 * i + 1] - 0x30];
  }
 
}
arduino/wio-canprot-framing-fr.txt · Last modified: 2024/05/18 09:54 by phil45