- 首页
- ScanDoc Development
- J2534 指南
- PassThru 函数说明
- PassThruIoctl
GET_CONFIG / SET_CONFIG v4.04 v5.0
协议参数
最后修改:
GET_CONFIG — 读取协议参数
返回指定通道的协议参数当前值。参数可以为默认设置,也可以是此前通过 SET_CONFIG 修改过的值。
| IoctlID |
0x01 |
| pInput |
SCONFIG_LIST* — 请求的参数列表 |
| pOutput |
NULL(结果写入 pInput) |
SET_CONFIG — 写入协议参数
为指定通道设置协议参数值。参数立即生效并影响后续的数据交换。
| IoctlID |
0x02 |
| pInput |
SCONFIG_LIST* — 要设置的参数列表 |
| pOutput |
NULL |
数据结构
typedef struct {
unsigned long Parameter; // 参数标识符
unsigned long Value; // 参数值
} SCONFIG;
typedef struct {
unsigned long NumOfParams; // 列表中的参数数量
SCONFIG *ConfigPtr; // 指向 SCONFIG 数组的指针
} SCONFIG_LIST;
返回的错误代码
| 代码 |
说明 |
可能原因及解决方法 |
| STATUS_NOERROR |
函数执行成功 |
— |
| ERR_DEVICE_NOT_CONNECTED |
未与适配器建立连接 |
- 适配器已关闭或不在可访问范围内
- 解决方法:检查供电和连接
|
| ERR_INVALID_CHANNEL_ID |
通道标识符无效 |
- ChannelID 未通过 PassThruConnect 获取
- 解决方法:执行 PassThruConnect
|
| ERR_NULL_PARAMETER |
传入 NULL 而非指针 |
- pInput 为 NULL
- 解决方法:传入指向 SCONFIG_LIST 的指针
|
| ERR_NOT_SUPPORTED |
不支持该参数 |
- 该参数对当前协议无效
- 解决方法:检查参数与协议的兼容性
|
| ERR_INVALID_IOCTL_VALUE |
参数值无效 |
|
| ERR_FAILED |
未定义错误 |
- 内部错误
- 解决方法:调用
PassThruGetLastError()
|
协议参数
通用参数(所有协议)
| 参数 |
值 |
说明 |
默认值 |
| LOOPBACK |
0x03 |
loopback 模式:0 — 关闭,1 — 开启 |
0 |
| 通用参数的完整列表请参见 SAE J2534-1 标准。 |
K-Line 参数(ISO 9141 / ISO 14230)
时间参数以毫秒为单位。
| 参数 |
值 |
说明 |
默认值 |
| P1_MAX |
0x07 |
来自 ECU 的最大字节间时间(ms) |
20 |
| P3_MIN |
0x0A |
响应结束与新请求之间的最小时间(ms) |
55 |
| P4_MIN |
0x0C |
来自诊断仪的最小字节间时间(ms) |
5 |
| K-Line 参数的完整列表请参见 SAE J2534-1 标准。 |
CAN 参数
| 参数 |
值 |
说明 |
默认值 |
| BIT_SAMPLE_POINT |
0x17 |
位采样点,以 % 表示(60-90) |
80 |
| SYNC_JUMP_WIDTH |
0x18 |
同步跳转宽度,以 % 表示(1-25) |
15 |
| HS_CAN_TERMINATIONJ2534-2 |
0x805E |
CAN 终端电阻:0 — 关闭,3 — 开启 |
0 |
ISO 15765 参数(CAN UDS)
| 参数 |
值 |
说明 |
默认值 |
| ISO15765_BS |
0x1E |
接收分段消息的 Block Size (BS) |
0(无限制) |
| ISO15765_STMIN |
0x1F |
接收用 STmin — CF 之间的最小时间(ms) |
0 |
| N_CR_MAX v5.0 |
0x805F |
等待 Consecutive Frame 的最大时间(ms) |
1000 |
| CAN_MIXED_FORMAT J2534-2 |
0x8000 |
混合格式(参见了解更多) |
0 |
| ISO 15765 参数的完整列表请参见 SAE J2534-1 标准。 |
CAN_MIXED_FORMAT — 混合格式 J2534-2
参数 CAN_MIXED_FORMAT 仅适用于 ISO 15765 通道。它允许在同一通道上同时接收和发送已格式化的 ISO 15765 消息和未格式化的 CAN 帧。
| 值 |
常量 |
说明 |
| 0 |
CAN_MIXED_FORMAT_OFF |
所有消息均按 ISO 15765 处理(默认) |
| 1 |
CAN_MIXED_FORMAT_ON |
消息按 ISO 15765 或未格式化的 CAN 帧处理 |
| 2 |
CAN_MIXED_FORMAT_ALL_FRAMES |
消息按 ISO 15765、未格式化的 CAN 帧或两者均可处理 |
重要更改此参数时:
- 接收和发送队列被清空
- 所有 PASS_FILTER 和 BLOCK_FILTER 被删除
- 带有未格式化 CAN 的 ProtocolID 的周期性消息被删除
使用混合格式时:
- FLOW_CONTROL_FILTER — 适用于 ISO 15765 消息
- PASS_FILTER / BLOCK_FILTER — 适用于未格式化的 CAN 帧
CAN FD 参数 J2534-2
| 参数 |
值 |
说明 |
默认值 |
| FD_CAN_DATA_PHASE_RATE |
0x805C |
CAN FD 数据阶段的数据传输速率(bit/s) |
0(未设置) |
| CAN FD 参数的完整列表请参见 SAE J2534-2 rev.2020-12 标准,第 87 页,表 90。 |
SW-CAN 参数(Single-Wire CAN)
| 参数 |
值 |
说明 |
默认值 |
| SW_CAN_HS_DATA_RATE |
0x8010 |
High-Speed 模式的速率(bit/s) |
83333 |
| SW-CAN 参数的完整列表请参见 SAE J2534-2 rev.2020-12 标准,第 29 页,表 9。 |
J1962_PINS — OBD-II 触点切换
参数 J1962_PINS(0x8001)可将信号线连接到 OBD-II 连接器的不同触点。其值为一个 16 位数:高字节为 Primary Pin (PP),低字节为 Secondary Pin (SS)。
Primary Pin 用于 K-Line、CAN-H、J1850+。Secondary Pin 用于 L-Line、CAN-L、J1850-。
Compact
| 常量 |
值 |
触点 |
| PP_1 / SS_1 |
0x01 |
Pin 1 |
| PP_2 / SS_2 |
0x02 |
Pin 2 |
| PP_3 / SS_3 |
0x03 |
Pin 3 |
| PP_6 / SS_6 |
0x06 |
Pin 6 (CAN-H) |
| PP_7 / SS_7 |
0x07 |
Pin 7 (K-Line) |
| PP_11 / SS_11 |
0x0B |
Pin 11 |
| PP_12 / SS_12 |
0x0C |
Pin 12 |
| PP_13 / SS_13 |
0x0D |
Pin 13 |
| PP_14 / SS_14 |
0x0E |
Pin 14 (CAN-L) |
| PP_15 / SS_15 |
0x0F |
Pin 15 (L-Line) |
TP 2.0 参数(VAG) J2534-2
TP 2.0 协议用于 VAG 车型(Volkswagen、Audi、Skoda、Seat)的诊断。
对于 TP 2.0 还支持参数 DATA_RATE、LOOPBACK、BIT_SAMPLE_POINT、SYNC_JUMP_WIDTH 和 J1962_PINS。默认值为:LOOPBACK = 0,BIT_SAMPLE_POINT = 80%,
SYNC_JUMP_WIDTH = 15%。
| 参数 |
值 |
说明 |
默认值 |
| TP2_0_T_BR_INT |
0x8044 |
Broadcast interval — 一次 broadcast 传输中 5 条消息之间的间隔(ms) |
20 |
| TP2_0_T_E |
0x8045 |
等待 Channel Acknowledge 或 Connection Acknowledge 的最大时间(ms) |
100 |
| TP2_0_MNTC |
0x8046 |
连接管理消息的重试次数 |
10 |
| TP 2.0 参数的完整列表请参见 SAE J2534-2 rev.2020-12 标准,第 78 页,表 77。 |
UART Echo Byte 参数 J2534-2
UART Echo Byte 协议用于老旧车型的诊断(SAE J2809、SAE J2818)。所有时间参数均以毫秒为单位。
| 参数 |
值 |
说明 |
SAE J2809 |
SAE J2818 |
| UEB_T0_MIN |
0x8028 |
发送地址字节前的最小空闲时间 |
t0 |
T_R0 |
| UEB_T1_MAX |
0x8029 |
激励与同步字节开始之间的最大时间 |
t1 |
t_r1 |
| UEB_T2_MAX |
0x802A |
同步字节与 KeyByte 1 之间的最大时间 |
t2 |
t_r2 |
| UART Echo Byte 参数的完整列表请参见 SAE J2534-2 rev.2020-12 标准,第 46 页,表 36。 |
示例
GET_CONFIG — 读取参数
C/C++ 示例
#include "j2534_dll.hpp"
unsigned long ChannelID; // 从 PassThruConnect 获取
SCONFIG Config[2];
SCONFIG_LIST ConfigList;
long ret;
// 请求 DATA_RATE 和 ISO15765_STMIN
Config[0].Parameter = DATA_RATE;
Config[0].Value = 0;
Config[1].Parameter = ISO15765_STMIN;
Config[1].Value = 0;
ConfigList.NumOfParams = 2;
ConfigList.ConfigPtr = Config;
ret = PassThruIoctl(ChannelID, GET_CONFIG, &ConfigList, NULL);
if (ret == STATUS_NOERROR)
{
printf("DATA_RATE: %lu bps\n", Config[0].Value);
printf("ISO15765_STMIN: %lu ms\n", Config[1].Value);
}
Kotlin (Android) 示例
// channelID 从 ptConnect 获取
val params = listOf(
PtConfig(parameter = DATA_RATE, value = 0u),
PtConfig(parameter = ISO15765_STMIN, value = 0u)
)
val result = j2534.ptIoctl(channelID, GET_CONFIG, params.size, params.toByteArray())
if (result.status == STATUS_NOERROR) {
val resultParams = result.toConfigList()
resultParams.forEach { config ->
Log.i("J2534", "参数 ${config.parameter}: ${config.value}")
}
}
Python 示例
from ctypes import *
config = (SCONFIG * 2)()
config[0].Parameter = DATA_RATE
config[1].Parameter = ISO15765_STMIN
config_list = SCONFIG_LIST()
config_list.NumOfParams = 2
config_list.ConfigPtr = config
ret = j2534.PassThruIoctl(channel_id, GET_CONFIG, byref(config_list), None)
if ret == 0:
print(f"DATA_RATE: {config[0].Value} bps")
print(f"ISO15765_STMIN: {config[1].Value} ms")
C# 示例
var configs = new SCONFIG[2];
configs[0].Parameter = DATA_RATE;
configs[1].Parameter = ISO15765_STMIN;
var configList = new SCONFIG_LIST {
NumOfParams = 2,
ConfigPtr = configs
};
int ret = J2534.PassThruIoctl(channelId, GET_CONFIG, ref configList, IntPtr.Zero);
if (ret == 0)
{
Console.WriteLine($"DATA_RATE: {configs[0].Value} bps");
Console.WriteLine($"ISO15765_STMIN: {configs[1].Value} ms");
}
SET_CONFIG — 设置参数
C/C++ 示例 — 配置 ISO 15765
#include "j2534_dll.hpp"
unsigned long ChannelID; // 为 ISO15765 从 PassThruConnect 获取
SCONFIG Config[3];
SCONFIG_LIST ConfigList;
long ret;
// 设置 ISO 15765 参数
Config[0].Parameter = ISO15765_STMIN;
Config[0].Value = 0; // CF 之间无延迟
Config[1].Parameter = ISO15765_BS;
Config[1].Value = 0; // 块大小无限制
Config[2].Parameter = ISO15765_PAD_VALUE;
Config[2].Value = 0xCC; // 填充 0xCC
ConfigList.NumOfParams = 3;
ConfigList.ConfigPtr = Config;
ret = PassThruIoctl(ChannelID, SET_CONFIG, &ConfigList, NULL);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
printf("SET_CONFIG 错误: %s\n", error);
}
C/C++ 示例 — 配置 J1962_PINS
#include "j2534_dll.hpp"
unsigned long ChannelID;
SCONFIG Config[1];
SCONFIG_LIST ConfigList;
long ret;
// 将 K-Line 连接到 Pin 3,将 L-Line 连接到 Pin 11
Config[0].Parameter = J1962_PINS;
Config[0].Value = PP_3 | SS_11; // 0x030B
ConfigList.NumOfParams = 1;
ConfigList.ConfigPtr = Config;
ret = PassThruIoctl(ChannelID, SET_CONFIG, &ConfigList, NULL);
if (ret == STATUS_NOERROR)
{
printf("K-Line 已连接到 Pin 3,L-Line 已连接到 Pin 11\n");
}
Kotlin (Android) 示例
// channelID 从 ptConnect 获取
val params = listOf(
PtConfig(parameter = ISO15765_STMIN, value = 0u),
PtConfig(parameter = ISO15765_BS, value = 0u),
PtConfig(parameter = ISO15765_PAD_VALUE, value = 0xCCu)
)
val result = j2534.ptIoctl(channelID, SET_CONFIG, params.size, params.toByteArray())
if (result.status == STATUS_NOERROR) {
Log.i("J2534", "ISO 15765 参数已设置")
} else {
Log.e("J2534", "SET_CONFIG 错误: ${result.status}")
}
Python 示例
from ctypes import *
config = (SCONFIG * 2)()
config[0].Parameter = DATA_RATE
config[0].Value = 500000 # 500 kbps
config[1].Parameter = CAN_MIXED_FORMAT
config[1].Value = 1 # 启用混合格式
config_list = SCONFIG_LIST()
config_list.NumOfParams = 2
config_list.ConfigPtr = config
ret = j2534.PassThruIoctl(channel_id, SET_CONFIG, byref(config_list), None)
if ret == 0:
print("CAN 参数已设置")
C# 示例
var configs = new SCONFIG[2];
configs[0].Parameter = DATA_RATE;
configs[0].Value = 500000; // 500 kbps
configs[1].Parameter = HS_CAN_TERMINATION;
configs[1].Value = 3; // 启用终端电阻
var configList = new SCONFIG_LIST {
NumOfParams = 2,
ConfigPtr = configs
};
int ret = J2534.PassThruIoctl(channelId, SET_CONFIG, ref configList, IntPtr.Zero);
if (ret == 0)
{
Console.WriteLine("参数已设置");
}