Establecimiento de una conexión según el protocolo
Última modificació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)
| Definición | pines | Descripción |
|---|---|---|
| J1850VPW | 2 VPW | Definido por las normas SAE J1850 y SAE J2178. Puede trabajar simultáneamente con CAN e ISO15765. No es compatible con los protocolos conmutables. |
| J1850PWM | 2, 10 PWM | Definido por la norma SAE J1850. Puede trabajar simultáneamente con CAN e ISO15765. No es compatible con los protocolos conmutables. |
| ISO9141 | 7K,15L Line | Definido por las normas ISO 9141 y SAE J1979. Puede trabajar simultáneamente con CAN e ISO15765. No es compatible con los protocolos conmutables. |
| ISO14230 | 7K,15L Line | |
| CAN | 6H,14L CAN | Flujo CAN sin procesar. Puede trabajar simultáneamente con todos los protocolos. |
| ISO15765 | 6H,14L CAN | Definido por las normas ISO 15765-4 y ISO 14229-1 UDS Puede trabajar simultáneamente con todos los protocolos. |
| ISO15765_PS | CAN conmutable | Versión conmutable de ISO 15765. Puede trabajar simultáneamente con CAN e ISO15765. |
| ISO13400_PS Quantex | Ethernet | DoIP (Diagnostics over IP) — diagnóstico a través de Ethernet según la norma ISO 13400. Para más información, consulte la descripción de DoIP. |
| Consulte la lista completa de protocolos en la norma SAE J2534-1. | ||
| Nombre de la constante | bit | Descripción |
|---|---|---|
| ISO9141_K_LINE | 12 | Uso de la línea L para la inicialización de los protocolos. 0 = Se utilizan la línea L y la línea K para la inicialización 1 = Se utiliza solo la línea K para la inicialización |
| CAN_29BIT_ID | 8 | Tipo de identificador CAN para los protocolos CAN e ISO 15765 0 = Se reciben paquetes con identificador de 11 bits. 1 = Se reciben paquetes con identificador de 29 bits. |
| Consulte la lista completa de indicadores en la norma SAE J2534-1. | ||
| 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 |
|
| ERR_INVALID_DEVICE_ID | Se indicó un identificador de adaptador DeviceID inexistente |
|
| ERR_NOT_SUPPORTED | El protocolo no es compatible con el adaptador |
|
| ERR_INVALID_PROTOCOL_ID v4.04 ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0 |
Se indicó un ProtocolID inexistente |
|
| ERR_NULL_PARAMETER | No se indicó el puntero pChannelID |
|
| ERR_INVALID_FLAGS v4.04 ERR_FLAG_NOT_SUPPORTED v5.0 |
Se indicó un indicador no admitido |
|
| ERR_BAUDRATE_NOT_SUPPORTED | Se indicó una velocidad de transmisión no admitida |
|
| ERR_CHANNEL_IN_USE | El canal ya está en uso |
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 |
|
#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
}
// 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}")
}
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()}")
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)}");
}
}
}