Quantex GmbH
您的地区:欧洲

PassThruConnect v4.04 v5.0

按协议建立连接

最后修改:

说明

该函数按指定协议建立连接。适配器支持两条独立的诊断线路。每个协议都关联到各自的线路。线路 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)

参数


返回的错误代码

代码 说明 可能的原因及解决方法
STATUS_NOERROR 函数执行成功
ERR_DEVICE_NOT_CONNECTED 与适配器无连接
  • 适配器已关闭或无供电
  • 解决方法:检查适配器的供电和指示灯
  • 无网络连接
  • 解决方法:检查网线或 WLAN 连接
  • IP 地址不正确
  • 解决方法:确认连接字符串中的 IP 地址填写正确
ERR_INVALID_DEVICE_ID 指定的适配器标识符 DeviceID 不存在
  • DeviceID 不是从 PassThruOpen 获取的
  • 解决方法:先调用 PassThruOpen 以获取正确的 DeviceID
  • 设备此前已被关闭
  • 解决方法:确认未对该设备调用过 PassThruClose
ERR_NOT_SUPPORTED 适配器不支持该协议
  • 不支持 SCI 协议
  • 解决方法:使用受支持的协议:CAN、ISO15765、ISO9141、ISO14230 等
  • 协议不兼容(例如同时使用 VPW 和 PWM)
  • 解决方法:使用兼容的协议组合
ERR_INVALID_PROTOCOL_ID v4.04
ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0
指定的 ProtocolID 不存在
  • 传入了错误的 ProtocolID 值
  • 解决方法:使用 j2534.h 中的常量(ISO15765、CAN、ISO14230 等)
ERR_NULL_PARAMETER 未指定 pChannelID 指针
  • 传入 NULL 而非 pChannelID 指针
  • 解决方法:传入指向 unsigned long 变量的有效指针
ERR_INVALID_FLAGS v4.04
ERR_FLAG_NOT_SUPPORTED v5.0
指定了不受支持的标志位
  • 对该协议传入了错误或不兼容的标志位
  • 解决方法:检查标志位组合。对于 ISO15765 请使用 CAN_29BIT_ID 或 CAN_ID_BOTH
ERR_BAUDRATE_NOT_SUPPORTED 指定了不受支持的通信速率
  • 该协议不支持此速率
  • 解决方法:对于 CAN 请使用标准速率:125000、250000、500000、1000000
  • 解决方法:对于 K-Line 请使用 5 至 115200 bit/s 的速率
ERR_CHANNEL_IN_USE 通道已被占用
  • 由 J2534 标准定义
重要:实际上该错误代码永远不会出现,因为再次调用 PassThruConnect 时会自动调用 PassThruDisconnect 并重新打开通道。
ERR_FAILED 内部错误
  • DLL 或适配器固件中出现错误
  • 解决方法:调用 PassThruGetLastError() 以获取详细说明
  • 解决方法:重启适配器并重试

示例

C/C++ 示例

#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);
    // 错误处理
}

Kotlin (Android) 示例

// 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}")
}

Python 示例

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()}")

C# 示例

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)}");
        }
    }
}