arduino:wio-canprot-framing-fr
Table of Contents
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