近期要做一款模拟车辆仪表和发动机数据的小设备,用来调试卡车EBS的诊断和参数标定功能,由于手上暂时没有CANalyzer,临时拿过来公司的仿版的ZLGCAN工具,发送了一个配置发动机的EC1报文,需要多包传输,使用仿版的CAN工具发现一个重大的BUG,多包帧做1939协议解析的时候会出现ID解析错误的情况:
仿版CAN工具和调试的设备
始终会把FEE3的报文ID解析成FEFF,困扰了好一会
J1939多包协议解析
借用了同事的CANalyzer,再次测试同一设备数据解析如下:
CANalyzer
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;
}
}
}