发布时间:2026-07-20阅读(1)
近期要做一款模拟车辆仪表和发动机数据的小设备,用来调试卡车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 0x18EBFF00uint8_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; } }}
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图