Quantex GmbH
Su región: Europa

PassThruConnect v4.04 v5.0

Establecimiento de una conexión según el protocolo

Última modificación:

Descripción

La función establece la comunicación según el protocolo indicado. El adaptador admite dos líneas de diagnóstico independientes. Cada protocolo está asociado a su propia línea. La línea 1 está conectada a los pines 6 y 14 del conector OBD y a ella solo pueden conectarse los protocolos ISO15765 y CAN. La línea 2 es conmutable y a ella pueden conectarse los demás protocolos. Como las líneas son independientes, se permite el trabajo simultáneo de dos protocolos. Por ejemplo ISO15765 e ISO14230, o ISO15765 e ISO15765_PS. El sufijo PS significa que el protocolo puede conmutarse a los pines del conector OBD.
Los protocolos ISO15765 y CAN, así como ISO15765_PS y CAN_PS, pueden trabajar en una misma línea física de forma simultánea. Esto significa que en un mismo adaptador se pueden inicializar a la vez hasta 4 protocolos. Al hacerlo es necesario tener en cuenta que las velocidades establecidas para cada par de protocolos deben ser iguales. Por ejemplo ISO15765 y CAN con una velocidad de 500 Kbit en los pines 6 y 14 del conector OBD, e ISO15765_PS y CAN_PS con una velocidad de 125 Kbit en los pines 3 y 11.

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

Parámetros


Códigos de error devueltos

Código Descripción Posibles causas y soluciones
STATUS_NOERROR La función se ejecutó correctamente
ERR_DEVICE_NOT_CONNECTED No hay conexión con el adaptador
  • El adaptador está apagado o no tiene alimentación
  • Solución: Compruebe la alimentación del adaptador y los indicadores
  • No hay conexión de red
  • Solución: Compruebe el cable de red o la conexión WLAN
  • Dirección IP incorrecta
  • Solución: Asegúrese de que la dirección IP esté indicada correctamente en la cadena de conexión
ERR_INVALID_DEVICE_ID Se indicó un identificador de adaptador DeviceID inexistente
  • El DeviceID no se obtuvo de PassThruOpen
  • Solución: Llame primero a PassThruOpen para obtener un DeviceID correcto
  • El dispositivo se cerró anteriormente
  • Solución: Compruebe que no se haya llamado a PassThruClose para este dispositivo
ERR_NOT_SUPPORTED El protocolo no es compatible con el adaptador
  • Los protocolos SCI no son compatibles
  • Solución: Utilice protocolos compatibles: CAN, ISO15765, ISO9141, ISO14230, etc.
  • Protocolos incompatibles (por ejemplo VPW y PWM simultáneamente)
  • Solución: Utilice combinaciones de protocolos compatibles
ERR_INVALID_PROTOCOL_ID v4.04
ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0
Se indicó un ProtocolID inexistente
  • Se pasó un valor de ProtocolID incorrecto
  • Solución: Utilice las constantes de j2534.h (ISO15765, CAN, ISO14230, etc.)
ERR_NULL_PARAMETER No se indicó el puntero pChannelID
  • Se pasó NULL en lugar de un puntero a pChannelID
  • Solución: Pase un puntero correcto a una variable unsigned long
ERR_INVALID_FLAGS v4.04
ERR_FLAG_NOT_SUPPORTED v5.0
Se indicó un indicador no admitido
  • Se pasó un indicador incorrecto o incompatible para este protocolo
  • Solución: Compruebe la combinación de indicadores. Para ISO15765 utilice CAN_29BIT_ID o CAN_ID_BOTH
ERR_BAUDRATE_NOT_SUPPORTED Se indicó una velocidad de transmisión no admitida
  • La velocidad no es compatible con este protocolo
  • Solución: Para CAN utilice velocidades estándar: 125000, 250000, 500000, 1000000
  • Solución: Para K-Line utilice velocidades de 5 a 115200 bit/s
ERR_CHANNEL_IN_USE El canal ya está en uso
  • Definido por la norma J2534
Importante: En la práctica este código de error nunca aparecerá, ya que al volver a llamar a PassThruConnect se producirá una llamada automática a PassThruDisconnect y el canal se reabrirá.
ERR_FAILED Error interno
  • Error en la biblioteca DLL o en el firmware del adaptador
  • Solución: Llame a PassThruGetLastError() para obtener una descripción detallada
  • Solución: Reinicie el adaptador y vuelva a intentarlo

Ejemplos

Ejemplo en C/C++

#include "j2534_dll.hpp"

// DeviceID obtenido anteriormente de PassThruOpen
unsigned long DeviceID;
unsigned long ChannelID;
unsigned long Flags = 0; // Depende del protocolo

// Conexión por bus CAN ISO 15765 a una velocidad de 500 Kbit/s
long ret = PassThruConnect(DeviceID, ISO15765, Flags, 500000, &ChannelID);
if (ret != STATUS_NOERROR)
{
    char error[256];
    PassThruGetLastError(error);
    // Tratamiento del error
}

Ejemplo en Kotlin (Android)

// deviceID obtenido anteriormente de 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
    // El canal de comunicación con el vehículo está abierto
    Log.i("J2534", "Canal abierto, ChannelID: $channelID")
} else {
    // Tratamiento del error
    Log.e("J2534", "Error al abrir el canal: ${resConnect.status}")
}

Ejemplo en Python

import ctypes

# Carga de la biblioteca
# 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 obtenido anteriormente de 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"Canal abierto, ChannelID: {channel_id.value}")
else:
    error_msg = ctypes.create_string_buffer(256)
    j2534.PassThruGetLastError(error_msg)
    print(f"Error: {error_msg.value.decode()}")

Ejemplo en 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($"Canal abierto, ChannelID: {channelId}");
        }
        else
        {
            byte[] errorMsg = new byte[256];
            PassThruGetLastError(errorMsg);
            Console.WriteLine($"Error: {System.Text.Encoding.ASCII.GetString(errorMsg)}");
        }
    }
}