Quantex GmbH
DE RU EN EL
Ваш регион: Европа

PassThruConnect v4.04 v5.0

Создание соединения по протоколу

Последнее изменение:

Описание

Функция устанавливает связь по заданному протоколу. Адаптер поддерживает две независимых диагностические линии. Каждый протокол связан со своей линией. Линия 1 подключена к выводам 6 и 14 OBD разъёма и к ней могут подключаться только протоколы ISO15768 И CAN. Линия 2 коммутируемая, и к ней могут подключаться остальные протоколы. Так как линии независимые, то допускается одновременная работа двух протоколов. Например ISO15765 и ISO14230 или ISO15765 и ISO15765_PS. Приставка PS означает, что протокол может коммутироваться на выводы OBD разъёма.
Протоколы ISO15765 и CAN а так же ISO15765_PS и CAN_PS могут работать на одной физической линии одновременно. Это означает, что вы можете инициализировать в одном адаптере одновременно до 4 протоколов. При этом необходимо учитывать, что устанавливаемые скорости для каждой пары протоколов должны быть одинаковыми. Например ISO15765 и CAN со скоростью 500 Кбит на 6 и 14 выводах OBD разъёма и ISO15765_PS и CAN_PS со скоростью 125 Кбит на 3 и 11 выводах.

long PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long BaudRate, unsigned long *pChannelID)

Параметры


Возвращаемые коды ошибок

Код Описание Возможные причины и решения
STATUS_NOERROR Функция выполнена успешно
ERR_DEVICE_NOT_CONNECTED Нет соединения с адаптером
  • Адаптер выключен или нет питания
  • Решение: Проверьте питание адаптера и индикаторы
  • Нет сетевого соединения
  • Решение: Проверьте сетевой кабель или WiFi подключение
  • Неправильный 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 бит/с
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; // Зависит от протокола

// Соединение по CAN-шине ISO 15765 на скорости 500 Кбит/с
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.сhnlId
    // Канал связи с автомобилем открыт
    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)}");
        }
    }
}