J2534 规范与功能说明 ›
ELM327 规范与命令说明 ›
ELM327 接口仅在 Nano ET 适配器中提供。其他 ScanDoc 适配器使用 J2534 PassThru 协议。
J2534 DLL、ELM327 和 ScanDoc 适配器固件中与集成相关的变化:新功能、协议和参数 — 附使用示例。
下载 J2534 库 2.0.0.200 — Windows x86/x64/ARM64(Windows 7 单独构建)、macOS(universal)、Linux(x64、x86、ARM、ARM64)、Android(arm64-v8a、armeabi-v7a、x86、x86_64)、iOS。
新增
ISO13400_PS(0x8FFD)和 HSFZ_PS(0x8FFC)。它们不属于 SAE J2534 标准,是 ScanDoc 的自有扩展:通过 Ethernet 诊断 — 网络内车辆发现(VIN、逻辑地址)、TCP 连接、routing activation、UDS 交换。tester 地址默认为 0 — 请在 routing activation 之前设置 ISO13400_SOURCE_ADDR,否则网关会拒绝;ECU 地址随每条消息传递([TA][SA][UDS]),ISO13400_TARGET_ADDR 不通过 Set/GetConfig 设置。发送按 P2 串行化:同一时间只有一个未完成的 UDS 请求,NRC 7F xx 78 将等待延长至 P2*max(6 秒)。新的通道参数 ISO13400_P3_DOIP(0x8108)— 消息间暂停。
uint32_t ch, code = 0;
pt_config_t sa = { ISO13400_SOURCE_ADDR, 0x0E80 };
pt_config_list_t cfg = { 1, &sa };
PassThruConnect(dev, ISO13400_PS, 0, 0, &ch);
PassThruIoctl(ch, SET_CONFIG, &cfg, NULL); /* SA — 在 routing activation 之前设置 */
PassThruIoctl(ch, ISO13400_DISCOVER_VEHICLES, NULL, NULL); /* ECU 的 IP 会自动记住 */
PassThruIoctl(ch, ISO13400_CONNECT_TCP, NULL, NULL);
PassThruIoctl(ch, ISO13400_ACTIVATE_ROUTING, NULL, &code); /* 0x10 = 成功 */
/* 之后 PassThruWriteMsgs / PassThruReadMsgs — 常规 UDS */
0x55(J2534 帧标记)— J2534,其他(文本 AT 命令)— ELM327。修复
PassThruStartMsgFilter 只比较 CAN ID 的 4 个字节,忽略给定的过滤器长度。现在按标准要求对整个长度进行比较:按帧内容的 PASS/BLOCK 可用。
/* 在接收队列中抑制 TesterPresent 应答(07E8 02 7E ...) */
pt_msg_t mask = {0}, pattern = {0};
mask.protocol_id = pattern.protocol_id = CAN;
mask.data_size = pattern.data_size = 6; /* 4 字节 CAN ID + 2 字节数据 */
memcpy(mask.data, "\xFF\xFF\xFF\xFF\xFF\xFF", 6);
memcpy(pattern.data, "\x00\x00\x07\xE8\x02\x7E", 6);
uint32_t fid;
PassThruStartMsgFilter(ch, BLOCK_FILTER, &mask, &pattern, NULL, &fid);
AT SH 会破坏 Flow Control(FC 无填充发送,DLC=3 — 网关不发送 Consecutive Frames),并用自己的 TX ID 覆盖接收过滤器(不使用 AT CRA 时接收损坏)。按数据手册 AT SH 只设置发送标头 — 接收过滤器现在仅由 AT CRA/CF/CM 控制。PassThruStopPeriodicMsg 停止后可能多发送一帧。_PS — 通过 SET_CONFIG(J1962_PINS) 选择引脚未生效,帧未上总线。修复