按协议建立连接
最后修改:
该函数按指定协议建立连接。适配器支持两条独立的诊断线路。每个协议都关联到各自的线路。线路 1 连接到 OBD 接口的 6 号和 14 号引脚,仅 ISO15765 和 CAN 协议可连接到该线路。线路 2 为可切换线路,其余协议均可连接到该线路。由于两条线路相互独立,因此允许两个协议同时工作。例如 ISO15765 和 ISO14230,或 ISO15765 和 ISO15765_PS。后缀 PS 表示该协议可切换至 OBD 接口的引脚。
ISO15765 和 CAN,以及 ISO15765_PS 和 CAN_PS 可在同一条物理线路上同时工作。这意味着您可以在一个适配器中同时初始化最多
4 个协议。但需要注意,每对协议设置的速率必须相同。例如在 OBD 接口的 6 号和 14 号引脚上以 500 Kbit 的速率运行 ISO15765 和 CAN,在 3 号和 11 号引脚上以
125 Kbit 的速率运行 ISO15765_PS 和 CAN_PS。
long PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long BaudRate, unsigned long *pChannelID)
| 定义 | 引脚 | 说明 |
|---|---|---|
| J1850VPW | 2 VPW | 由标准 SAE J1850 和 SAE J2178 定义。可与 CAN 和 ISO15765 同时工作,与可切换协议不兼容。 |
| J1850PWM | 2, 10 PWM | 由标准 SAE J1850 定义。可与 CAN 和 ISO15765 同时工作,与可切换协议不兼容。 |
| ISO9141 | 7K,15L Line | 由标准 ISO 9141 和 SAE J1979 定义。可与 CAN 和 ISO15765 同时工作,与可切换协议不兼容。 |
| ISO14230 | 7K,15L Line | |
| CAN | 6H,14L CAN | 未经处理的 CAN 数据流。可与所有协议同时工作。 |
| ISO15765 | 6H,14L CAN | 由标准 ISO 15765-4 和 ISO 14229-1 UDS 定义。可与所有协议同时工作。 |
| ISO15765_PS | 可切换 CAN | ISO 15765 的可切换版本。可与 CAN 和 ISO15765 同时工作。 |
| ISO13400_PS Quantex | Ethernet | DoIP (Diagnostics over IP) — 按 ISO 13400 标准通过 Ethernet 进行诊断。详见 DoIP 说明。 |
| 完整的协议列表请参见 SAE J2534-1 标准。 | ||
| 常量名称 | 位 | 说明 |
|---|---|---|
| ISO9141_K_LINE | 12 | 初始化协议时是否使用 L 线路。 0 = 使用 L 线路和 K 线路进行初始化 1 = 仅使用 K 线路进行初始化 |
| CAN_29BIT_ID | 8 | CAN 和 ISO 15765 协议的 CAN 标识符类型 0 = 接收 11 位标识符的数据包。 1 = 接收 29 位标识符的数据包。 |
| 完整的标志位列表请参见 SAE J2534-1 标准。 | ||
| 代码 | 说明 | 可能的原因及解决方法 |
|---|---|---|
| STATUS_NOERROR | 函数执行成功 | — |
| ERR_DEVICE_NOT_CONNECTED | 与适配器无连接 |
|
| ERR_INVALID_DEVICE_ID | 指定的适配器标识符 DeviceID 不存在 |
|
| ERR_NOT_SUPPORTED | 适配器不支持该协议 |
|
| ERR_INVALID_PROTOCOL_ID v4.04 ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0 |
指定的 ProtocolID 不存在 |
|
| ERR_NULL_PARAMETER | 未指定 pChannelID 指针 |
|
| ERR_INVALID_FLAGS v4.04 ERR_FLAG_NOT_SUPPORTED v5.0 |
指定了不受支持的标志位 |
|
| ERR_BAUDRATE_NOT_SUPPORTED | 指定了不受支持的通信速率 |
|
| ERR_CHANNEL_IN_USE | 通道已被占用 |
重要:实际上该错误代码永远不会出现,因为再次调用 PassThruConnect 时会自动调用 PassThruDisconnect 并重新打开通道。
|
| ERR_FAILED | 内部错误 |
|
#include "j2534_dll.hpp"
// DeviceID 此前已从 PassThruOpen 获取
unsigned long DeviceID;
unsigned long ChannelID;
unsigned long Flags = 0; // 取决于协议
// 以 500 Kbit/s 的速率通过 ISO 15765 CAN 总线建立连接
long ret = PassThruConnect(DeviceID, ISO15765, Flags, 500000, &ChannelID);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
// 错误处理
}
// deviceID 此前已从 ptOpen 获取
val protocolID = ISO15765
val flags = 0
val baudRate = 500000
val resConnect = j2534.ptConnect(deviceID, protocolID, flags, baudRate)
if (resConnect.status == STATUS_NOERROR) {
val channelID = resConnect.chnlId
// 与车辆的通信通道已打开
Log.i("J2534", "通道已打开,ChannelID: $channelID")
} else {
// 错误处理
Log.e("J2534", "打开通道出错: ${resConnect.status}")
}
import ctypes
# 加载库
# Windows: j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")
# macOS: j2534 = ctypes.CDLL("libj2534_v04_04.dylib")
# Linux: j2534 = ctypes.CDLL("libj2534_v04_04.so")
ISO15765 = 6
STATUS_NOERROR = 0
# device_id 此前已从 PassThruOpen 获取
device_id = ctypes.c_ulong(0)
channel_id = ctypes.c_ulong()
protocol_id = ISO15765
flags = 0
baud_rate = 500000
ret = j2534.PassThruConnect(device_id, protocol_id, flags, baud_rate, ctypes.byref(channel_id))
if ret == STATUS_NOERROR:
print(f"通道已打开,ChannelID: {channel_id.value}")
else:
error_msg = ctypes.create_string_buffer(256)
j2534.PassThruGetLastError(error_msg)
print(f"错误: {error_msg.value.decode()}")
using System;
using System.Runtime.InteropServices;
public class J2534Example
{
// Windows: j2534sd_v04_04_x64.dll
[DllImport("j2534sd_v04_04_x64.dll")]
public static extern int PassThruConnect(uint deviceId, uint protocolId,
uint flags, uint baudRate, out uint channelId);
[DllImport("j2534sd_v04_04_x64.dll")]
public static extern int PassThruGetLastError(byte[] errorMsg);
const uint ISO15765 = 6;
const int STATUS_NOERROR = 0;
public void ConnectExample(uint deviceId)
{
uint channelId;
uint flags = 0;
uint baudRate = 500000;
int ret = PassThruConnect(deviceId, ISO15765, flags, baudRate, out channelId);
if (ret == STATUS_NOERROR)
{
Console.WriteLine($"通道已打开,ChannelID: {channelId}");
}
else
{
byte[] errorMsg = new byte[256];
PassThruGetLastError(errorMsg);
Console.WriteLine($"错误: {System.Text.Encoding.ASCII.GetString(errorMsg)}");
}
}
}