近期要做一款模拟车辆仪表和发动机数据的小设备,用来调试卡车EBS的诊断和参数标定功能,由于手上暂时没有CANalyzer,临时拿过来公司的仿版的ZLGCAN工具,发送了一个配置发动机的EC1报文,需要多包传输,使用仿版的CAN工具发现一个重大的BUG,多包帧做1939协议解析的时候会出现ID解析错误的情况:

can报文读取方法 某一款国产CAN工具在解析J1939多包报文的BUG问题测试(1)

仿版CAN工具和调试的设备

始终会把FEE3的报文ID解析成FEFF,困扰了好一会

can报文读取方法 某一款国产CAN工具在解析J1939多包报文的BUG问题测试(2)

J1939多包协议解析

借用了同事的CANalyzer,再次测试同一设备数据解析如下:

can报文读取方法 某一款国产CAN工具在解析J1939多包报文的BUG问题测试(3)

CANalyzer

can报文读取方法 某一款国产CAN工具在解析J1939多包报文的BUG问题测试(4)

CANalyzer的解析结果

通过对比发现,仿版的CAN工具确实存在一些J1939的协议解析BUG,另外我在使用过程中发现另外一个问题:仿版工具的CAN报文定时精度不够好,只能勉强凑合用用,另外结尾分享一下我的多包测试的代码。

#define CANID_BAM_E 0x18ECFF00 #define CANID_TPDT_E 0x18EBFF00 uint8_t J1939_TPCM[8] ={0x20,0x1C,0x00,0x04,0xFF,0xE3,0xFE,0x00}; uint8_t J1939_TPDT1[8]={0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; uint8_t J1939_TPDT2[8]={0x02,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; uint8_t J1939_TPDT3[8]={0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; uint8_t J1939_TPDT4[8]={0x04,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; int main(void) { Bsp_Init(); while(1) { if(SysTimer_5000ms==1) { Can_Send_Msg(J1939_TPCM,CANID_BAM_E,8); delay_ms(1); Can_Send_Msg(J1939_TPDT1,CANID_TPDT_E,8); delay_ms(1); Can_Send_Msg(J1939_TPDT1,CANID_TPDT_E,8); delay_ms(1); Can_Send_Msg(J1939_TPDT2,CANID_TPDT_E,8); delay_ms(1); Can_Send_Msg(J1939_TPDT3,CANID_TPDT_E,8); delay_ms(1); Can_Send_Msg(J1939_TPDT4,CANID_TPDT_E,8); SysTimer_5000ms=0; } } }

,