Quantex GmbH
Tu región: Europa

PassThruWriteMsgs v4.04

Transmisión de mensajes

Última modificación:

Descripción

La función transmite mensajes mediante el protocolo de diagnóstico. La cola de transmisión del adaptador está dimensionada para 50 mensajes por cola para un canal y dispone de 64 KB de memoria libre para todas las colas. Cuando la cola o toda la memoria libre se llena, la recepción de mensajes en la cola de transmisión se suspende.

long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
Importante: Para el protocolo ISO 15765, antes de transmitir mensajes es necesario establecer el filtro Flow Control mediante PassThruStartMsgFilter. Sin él, la función devolverá el error ERR_NO_FLOW_CONTROL.

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 se ha perdido la conexión
  • Solución: Compruebe la alimentación del adaptador y la conexión de red/BLE
  • Dirección IP indicada incorrectamente
  • Solución: Compruebe los parámetros de conexión en PassThruOpen
ERR_INVALID_CHANNEL_ID Se ha indicado un identificador de canal ChannelID inexistente
  • El ChannelID no se obtuvo de PassThruConnect
  • Solución: Use el ChannelID devuelto por la función PassThruConnect
  • El canal se cerró mediante PassThruDisconnect
  • Solución: Vuelva a abrir el canal mediante PassThruConnect
ERR_NULL_PARAMETER No se ha indicado el puntero pMsg o pNumMsgs
  • Se ha pasado NULL en lugar de un puntero
  • Solución: Pase un puntero válido al array de mensajes y a la variable de cantidad
ERR_TIMEOUT En el tiempo indicado no se pudieron transmitir todos los mensajes
  • Demasiados mensajes o tiempo de espera demasiado corto
  • Solución: Aumente el valor de Timeout o reduzca la cantidad de mensajes
  • Problemas en el bus (sin confirmación CAN)
  • Solución: Compruebe la conexión con el vehículo y el estado del bus
ERR_INVALID_MSG Estructura de mensaje incorrecta en pMsg
  • Datos o tamaño del mensaje incorrectos
  • Solución: Compruebe los campos DataSize, Data y TxFlags en la estructura PASSTHRU_MSG
ERR_MSG_PROTOCOL_ID El protocolo del mensaje no coincide con el protocolo del canal
  • El ProtocolID en la estructura del mensaje difiere del indicado en PassThruConnect
  • Solución: Establezca en pMsg->ProtocolID el mismo protocolo que se usó al abrir el canal
ERR_NO_FLOW_CONTROL Para el protocolo ISO 15765 no se ha establecido el filtro Flow Control
  • Intento de transmitir un mensaje ISO 15765 sin un filtro configurado
  • Solución: Llame a PassThruStartMsgFilter con el tipo FLOW_CONTROL_FILTER antes de la transmisión
ERR_BUFFER_FULL La cola de transmisión está desbordada
  • Demasiados mensajes en la cola (límite: 50 mensajes, 64 KB)
  • Solución: Espere a que se envíen los mensajes anteriores o vacíe la cola mediante PassThruIoctl(CLEAR_TX_BUFFER)
ERR_FAILED Error interno en la biblioteca o en el adaptador
  • Error de asignación de memoria o fallo de la pila
  • Solución: Llame a PassThruGetLastError() para obtener más detalles

Ejemplos

Ejemplo en C/C++

#include "j2534_dll.hpp"

// ChannelID obtenido previamente de PassThruConnect
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;

// Creación del mensaje ISO 15765 (solicitud SID 0x22, PID 0xF190)
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF;
Msg.Data[4] = 0x22;
Msg.Data[5] = 0xF1;
Msg.Data[6] = 0x90;
Msg.DataSize = 7;

long ret = PassThruWriteMsg(ChannelID, &Msg, &NumMsgs, Timeout);
if (ret != STATUS_NOERROR) {
    char error[256];
    PassThruGetLastError(error);
    // Tratamiento del error
}

Ejemplo en Kotlin (Android)

// channelID obtenido previamente de ptConnect
val msg = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 7,
    txFlags = ISO15765_FRAME_PAD,
    // Solicitud VIN (SID 0x22, PID 0xF190)
    data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x22, 0xF1.toByte(), 0x90.toByte())
)

val messages = arrayOf(msg)
val timeout = 200 // ms

val result = j2534.ptWriteMsgs(channelID, messages, timeout)
if (result.status == STATUS_NOERROR) {
    Log.i("J2534", "Mensajes enviados: ${result.numMsgs}")
} else {
    Log.e("J2534", "Error de envío: ${result.status}")
}

Ejemplo en Python

# channel_id obtenido previamente de PassThruConnect
msg = PassThruMsg()
msg.ProtocolID = ISO15765
msg.TxFlags = ISO15765_FRAME_PAD
msg.Data = bytes([0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90])
msg.DataSize = 7

num_msgs = ctypes.c_ulong(1)
timeout = 200  # ms

ret = j2534.PassThruWriteMsg(channel_id, ctypes.byref(msg), ctypes.byref(num_msgs), timeout)
if ret == 0:  # STATUS_NOERROR
    print(f"Mensajes enviados: {num_msgs.value}")
else:
    print(f"Error de envío: {ret}")

Ejemplo en C#

// channelId obtenido previamente de PassThruConnect
var msg = new PassThruMsg {
    ProtocolID = ISO15765,
    TxFlags = ISO15765_FRAME_PAD,
    Data = new byte[] { 0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90 },
    DataSize = 7
};

uint numMsgs = 1;
uint timeout = 200; // ms

int ret = J2534.PassThruWriteMsg(channelId, ref msg, ref numMsgs, timeout);
if (ret == 0) {
    Console.WriteLine($"Mensajes enviados: {numMsgs}");
} else {
    Console.WriteLine($"Error de envío: {ret}");
}