By Dipl. Ing. Frank Gerlach(frankgerlach.tai@gmx.de)
CAN DBC ("CAN Communications Matrix") files document the data structures transmitted on an automotive, aerospace or other CAN Bus. This page presents a DBC Parser written in the Sappeur language. The generator side can be extended by software engineers in order to generate project-specific code for their CAN use case.
In the following a dbc file is (partially) printed as CSV to STDOUT
void CSV_Printer::print(&DBC_Parser p) { p.botschaften.resetIterator(); var longlong canid; var HT_Zeiger_Adapter_Botschaft hazBotschaft; var String_16 mask; var PrintfClass pfc; pfc.fstr("message;message-id;signal;bitposition;width;signal-comment").pr(); while( p.botschaften.nextElem(canid,hazBotschaft) == 1 ) { var Botschaft* message = hazBotschaft.zeiger; var String_16 signalName; var HT_Zeiger_Adapter_Signal hazSignal; message.signale.resetIterator(); while( message.signale.nextElem(signalName,hazSignal) == 1 ) { var Signal* signal = hazSignal.zeiger; pfc.fstr("$;$;$;$;$;$").sa(message.name) .sa(message.canid) .sa(signal.name) .sa(signal.stelle) .sa(signal.breite) .sa(signal.kommentar).pr(); } } }
Print the "Bosch2018.dbc" and filter out all WHEEL-related signals
$ ./sprprog.exe Bosch2018.dbc |egrep WHEEL ROUGH_WHEEL_SPEED;597;WHEEL_SPEED_RR;31;8; ROUGH_WHEEL_SPEED;597;WHEEL_SPEED_FR;15;8; ROUGH_WHEEL_SPEED;597;WHEEL_SPEED_FL;7;8; ROUGH_WHEEL_SPEED;597;CHECKSUM;59;4; ROUGH_WHEEL_SPEED;597;SET_TO_X55_2;47;8; ROUGH_WHEEL_SPEED;597;WHEEL_SPEED_RL;23;8; ROUGH_WHEEL_SPEED;597;LONG_COUNTER;55;8; ROUGH_WHEEL_SPEED;597;SET_TO_X55;39;8; ROUGH_WHEEL_SPEED;597;COUNTER;61;2;
Print the "Bosch2018.dbc" and filter out all COUNTER signals.
$ ./sprprog.exe ~/DBC_Parser/testDaten/Bosch2018.dbc |egrep COUNTER STEERING_CONTROL;228;COUNTER;37;2; ACC_CONTROL_ON;495;COUNTER;61;2; BOSCH_SUPPLEMENTAL_1;229;COUNTER;61;2; LEFT_LANE_LINE_1;576;COUNTER;61;2; LEFT_LANE_LINE_2;577;COUNTER;61;2; SCM_FEEDBACK;806;COUNTER;61;2; RIGHT_LANE_LINE_1;579;COUNTER;61;2; RIGHT_LANE_LINE_2;580;COUNTER;61;2; ADJACENT_LEFT_LANE_LINE_1;582;COUNTER;61;2; LKAS_HUD_A;13274;COUNTER;37;2; XXX_16;545;COUNTER;45;2; ADJACENT_LEFT_LANE_LINE_2;583;COUNTER;61;2; LKAS_HUD_B;13275;COUNTER;61;2; ADJACENT_RIGHT_LANE_LINE_1;585;COUNTER;61;2; ADJACENT_RIGHT_LANE_LINE_2;586;COUNTER;61;2; SCM_BUTTONS;662;COUNTER;29;2; CAR_SPEED;777;COUNTER;61;2; STEER_STATUS;399;COUNTER;53;2; ACC_HUD;780;COUNTER;61;2; ACC_CONTROL;479;COUNTER;61;2; CAMERA_MESSAGES;862;COUNTER;61;2; ROUGH_WHEEL_SPEED;597;LONG_COUNTER;55;8; ROUGH_WHEEL_SPEED;597;COUNTER;61;2; EPB_STATUS;450;COUNTER;61;2; KINEMATICS;148;COUNTER;61;2;
extern char can_buffer_LKAS_HUD_A[8]; u_32 can_read_LKAS_HUD_A_LDW_ON(void); u_32 can_read_LKAS_HUD_A_BEEP(void); u_32 can_read_LKAS_HUD_A_CLEAN_WINDSHIELD(void); u_32 can_read_LKAS_HUD_A_SET_ME_X01(void); u_32 can_read_LKAS_HUD_A_LDW_OFF(void); u_32 can_read_LKAS_HUD_A_CHECKSUM(void); u_32 can_read_LKAS_HUD_A_LDW_RIGHT(void); u_32 can_read_LKAS_HUD_A_LKAS_OFF(void); u_32 can_read_LKAS_HUD_A_BOH(void); u_32 can_read_LKAS_HUD_A_LKAS_PROBLEM(void); u_32 can_read_LKAS_HUD_A_SET_ME_X41(void); u_32 can_read_LKAS_HUD_A_CAM_TEMP_HIGH(void); u_32 can_read_LKAS_HUD_A_LDW_PROBLEM(void); u_32 can_read_LKAS_HUD_A_DASHED_LANES(void); u_32 can_read_LKAS_HUD_A_DTC(void); u_32 can_read_LKAS_HUD_A_SOLID_LANES(void); u_32 can_read_LKAS_HUD_A_COUNTER(void); u_32 can_read_LKAS_HUD_A_STEERING_REQUIRED(void); extern char can_buffer_XXX_16[8]; u_32 can_read_XXX_16_COUNTER(void); u_32 can_read_XXX_16_DRIVE_MODE(void); u_32 can_read_XXX_16_ECON_ON(void); u_32 can_read_XXX_16_CHECKSUM(void); extern char can_buffer_LKAS_HUD_B[8]; u_32 can_read_LKAS_HUD_B_LDW_ON(void); u_32 can_read_LKAS_HUD_B_BEEP(void); u_32 can_read_LKAS_HUD_B_CLEAN_WINDSHIELD(void); u_32 can_read_LKAS_HUD_B_SET_ME_X01(void); u_32 can_read_LKAS_HUD_B_LDW_OFF(void); u_32 can_read_LKAS_HUD_B_CHECKSUM(void); u_32 can_read_LKAS_HUD_B_LDW_RIGHT(void); u_32 can_read_LKAS_HUD_B_LKAS_OFF(void); u_32 can_read_LKAS_HUD_B_BOH(void); u_32 can_read_LKAS_HUD_B_LKAS_PROBLEM(void); u_32 can_read_LKAS_HUD_B_SET_ME_X41(void); u_32 can_read_LKAS_HUD_B_CAM_TEMP_HIGH(void); u_32 can_read_LKAS_HUD_B_LDW_PROBLEM(void); u_32 can_read_LKAS_HUD_B_DASHED_LANES(void); u_32 can_read_LKAS_HUD_B_DTC(void); u_32 can_read_LKAS_HUD_B_SOLID_LANES(void); u_32 can_read_LKAS_HUD_B_COUNTER(void); u_32 can_read_LKAS_HUD_B_STEERING_REQUIRED(void); extern char can_buffer_ACC_HUD[8]; u_32 can_read_ACC_HUD_BOH_4(void); u_32 can_read_ACC_HUD_BOH_5(void); u_32 can_read_ACC_HUD_DTC_MODE(void); u_32 can_read_ACC_HUD_CHECKSUM(void); u_32 can_read_ACC_HUD_SET_TO_1(void); u_32 can_read_ACC_HUD_BOH(void); u_32 can_read_ACC_HUD_FCM_PROBLEM(void); u_32 can_read_ACC_HUD_HUD_DISTANCE(void); u_32 can_read_ACC_HUD_BOH_3(void); u_32 can_read_ACC_HUD_IMPERIAL_UNIT(void); u_32 can_read_ACC_HUD_RADAR_OBSTRUCTED(void); u_32 can_read_ACC_HUD_ACC_ON(void); u_32 can_read_ACC_HUD_ENABLE_MINI_CAR(void); u_32 can_read_ACC_HUD_ZEROS_BOH(void); u_32 can_read_ACC_HUD_SET_TO_X1(void); u_32 can_read_ACC_HUD_ACC_PROBLEM(void); u_32 can_read_ACC_HUD_BOH_6(void); u_32 can_read_ACC_HUD_HUD_LEAD(void); u_32 can_read_ACC_HUD_CRUISE_CONTROL_LABEL(void); u_32 can_read_ACC_HUD_FCM_OFF(void); u_32 can_read_ACC_HUD_COUNTER(void); u_32 can_read_ACC_HUD_CRUISE_SPEED(void); extern char can_buffer_CAMERA_MESSAGES[8]; u_32 can_read_CAMERA_MESSAGES_ZEROS_BOH_2(void); u_32 can_read_CAMERA_MESSAGES_AUTO_HIGHBEAMS_ACTIVE(void); u_32 can_read_CAMERA_MESSAGES_CHECKSUM(void); u_32 can_read_CAMERA_MESSAGES_HIGHBEAMS_ON(void); u_32 can_read_CAMERA_MESSAGES_ZEROS_BOH(void); u_32 can_read_CAMERA_MESSAGES_COUNTER(void); /* Botschaft LKAS_HUD_A */ char can_buffer_LKAS_HUD_A[8]; u_32 can_read_LKAS_HUD_A_LDW_ON(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 28) & 1; } u_32 can_read_LKAS_HUD_A_BEEP(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 17) & 3; } u_32 can_read_LKAS_HUD_A_CLEAN_WINDSHIELD(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 26) & 1; } u_32 can_read_LKAS_HUD_A_SET_ME_X01(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 20) & 1; } u_32 can_read_LKAS_HUD_A_LDW_OFF(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 27) & 1; } u_32 can_read_LKAS_HUD_A_CHECKSUM(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 35) & 15; } u_32 can_read_LKAS_HUD_A_LDW_RIGHT(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 9) & 1; } u_32 can_read_LKAS_HUD_A_LKAS_OFF(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 11) & 1; } u_32 can_read_LKAS_HUD_A_BOH(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 23) & 3; } u_32 can_read_LKAS_HUD_A_LKAS_PROBLEM(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 12) & 1; } u_32 can_read_LKAS_HUD_A_SET_ME_X41(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 6) & 127; } u_32 can_read_LKAS_HUD_A_CAM_TEMP_HIGH(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 7) & 1; } u_32 can_read_LKAS_HUD_A_LDW_PROBLEM(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 21) & 1; } u_32 can_read_LKAS_HUD_A_DASHED_LANES(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 14) & 1; } u_32 can_read_LKAS_HUD_A_DTC(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 13) & 1; } u_32 can_read_LKAS_HUD_A_SOLID_LANES(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 10) & 1; } u_32 can_read_LKAS_HUD_A_COUNTER(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 37) & 3; } u_32 can_read_LKAS_HUD_A_STEERING_REQUIRED(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_A; return ((*bufPtr) >> 8) & 1; } /* Botschaft XXX_16 */ char can_buffer_XXX_16[8]; u_32 can_read_XXX_16_COUNTER(void) { u_64* bufPtr = (u_64*)can_buffer_XXX_16; return ((*bufPtr) >> 45) & 3; } u_32 can_read_XXX_16_DRIVE_MODE(void) { u_64* bufPtr = (u_64*)can_buffer_XXX_16; return ((*bufPtr) >> 37) & 3; } u_32 can_read_XXX_16_ECON_ON(void) { u_64* bufPtr = (u_64*)can_buffer_XXX_16; return ((*bufPtr) >> 23) & 1; } u_32 can_read_XXX_16_CHECKSUM(void) { u_64* bufPtr = (u_64*)can_buffer_XXX_16; return ((*bufPtr) >> 43) & 15; } /* Botschaft LKAS_HUD_B */ char can_buffer_LKAS_HUD_B[8]; u_32 can_read_LKAS_HUD_B_LDW_ON(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 28) & 1; } u_32 can_read_LKAS_HUD_B_BEEP(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 17) & 3; } u_32 can_read_LKAS_HUD_B_CLEAN_WINDSHIELD(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 26) & 1; } u_32 can_read_LKAS_HUD_B_SET_ME_X01(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 20) & 1; } u_32 can_read_LKAS_HUD_B_LDW_OFF(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 27) & 1; } u_32 can_read_LKAS_HUD_B_CHECKSUM(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 59) & 15; } u_32 can_read_LKAS_HUD_B_LDW_RIGHT(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 9) & 1; } u_32 can_read_LKAS_HUD_B_LKAS_OFF(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 11) & 1; } u_32 can_read_LKAS_HUD_B_BOH(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 23) & 3; } u_32 can_read_LKAS_HUD_B_LKAS_PROBLEM(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 12) & 1; } u_32 can_read_LKAS_HUD_B_SET_ME_X41(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 6) & 127; } u_32 can_read_LKAS_HUD_B_CAM_TEMP_HIGH(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 7) & 1; } u_32 can_read_LKAS_HUD_B_LDW_PROBLEM(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 21) & 1; } u_32 can_read_LKAS_HUD_B_DASHED_LANES(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 14) & 1; } u_32 can_read_LKAS_HUD_B_DTC(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 13) & 1; } u_32 can_read_LKAS_HUD_B_SOLID_LANES(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 10) & 1; } u_32 can_read_LKAS_HUD_B_COUNTER(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 61) & 3; } u_32 can_read_LKAS_HUD_B_STEERING_REQUIRED(void) { u_64* bufPtr = (u_64*)can_buffer_LKAS_HUD_B; return ((*bufPtr) >> 8) & 1; } /* Botschaft ACC_HUD */ char can_buffer_ACC_HUD[8]; u_32 can_read_ACC_HUD_BOH_4(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 42) & 1; } u_32 can_read_ACC_HUD_BOH_5(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 41) & 1; } u_32 can_read_ACC_HUD_DTC_MODE(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 39) & 1; } u_32 can_read_ACC_HUD_CHECKSUM(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 59) & 15; } u_32 can_read_ACC_HUD_SET_TO_1(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 36) & 1; } u_32 can_read_ACC_HUD_BOH(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 38) & 1; } u_32 can_read_ACC_HUD_FCM_PROBLEM(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 34) & 1; } u_32 can_read_ACC_HUD_HUD_DISTANCE(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 47) & 3; } u_32 can_read_ACC_HUD_BOH_3(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 43) & 1; } u_32 can_read_ACC_HUD_IMPERIAL_UNIT(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 54) & 1; } u_32 can_read_ACC_HUD_RADAR_OBSTRUCTED(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 33) & 1; } u_32 can_read_ACC_HUD_ACC_ON(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 52) & 1; } u_32 can_read_ACC_HUD_ENABLE_MINI_CAR(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 32) & 1; } u_32 can_read_ACC_HUD_ZEROS_BOH(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 7) & 16777215; } u_32 can_read_ACC_HUD_SET_TO_X1(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 55) & 1; } u_32 can_read_ACC_HUD_ACC_PROBLEM(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 37) & 1; } u_32 can_read_ACC_HUD_BOH_6(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 51) & 15; } u_32 can_read_ACC_HUD_HUD_LEAD(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 45) & 3; } u_32 can_read_ACC_HUD_CRUISE_CONTROL_LABEL(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 40) & 1; } u_32 can_read_ACC_HUD_FCM_OFF(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 35) & 1; } u_32 can_read_ACC_HUD_COUNTER(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 61) & 3; } u_32 can_read_ACC_HUD_CRUISE_SPEED(void) { u_64* bufPtr = (u_64*)can_buffer_ACC_HUD; return ((*bufPtr) >> 31) & 255; } /* Botschaft CAMERA_MESSAGES */ char can_buffer_CAMERA_MESSAGES[8]; u_32 can_read_CAMERA_MESSAGES_ZEROS_BOH_2(void) { u_64* bufPtr = (u_64*)can_buffer_CAMERA_MESSAGES; return ((*bufPtr) >> 51) & 15; } u_32 can_read_CAMERA_MESSAGES_AUTO_HIGHBEAMS_ACTIVE(void) { u_64* bufPtr = (u_64*)can_buffer_CAMERA_MESSAGES; return ((*bufPtr) >> 53) & 1; } u_32 can_read_CAMERA_MESSAGES_CHECKSUM(void) { u_64* bufPtr = (u_64*)can_buffer_CAMERA_MESSAGES; return ((*bufPtr) >> 59) & 15; } u_32 can_read_CAMERA_MESSAGES_HIGHBEAMS_ON(void) { u_64* bufPtr = (u_64*)can_buffer_CAMERA_MESSAGES; return ((*bufPtr) >> 52) & 1; } u_32 can_read_CAMERA_MESSAGES_ZEROS_BOH(void) { u_64* bufPtr = (u_64*)can_buffer_CAMERA_MESSAGES; return ((*bufPtr) >> 7) & 262143; } u_32 can_read_CAMERA_MESSAGES_COUNTER(void) { u_64* bufPtr = (u_64*)can_buffer_CAMERA_MESSAGES; return ((*bufPtr) >> 61) & 3; }
The Sappeur code can be easily expanded (or minimized) in order to adapt to specific use cases.
Currently, negative signals are not supported. The parser will create an error message for them. Please change them to positive for the time being.
You will need the cygwin toolkit to compile and/or run the following package
Please contact me when you want to run on Linux (or other POSIX-like systems); I can help with this effort
DBC Parser v 1.4