Quantex GmbH
Su región: Europa

PassThruQueueMsgs v5.0

Encolado de mensajes en la cola del canal para su transmisión

Última modificación:

Descripción

La función coloca mensajes en la cola de envío del dispositivo pass-thru para el canal indicado. Si la ejecución es satisfactoria, se devuelve STATUS_NOERROR y el valor apuntado por pNumMsgs se actualiza y contiene el número real de mensajes encolados.

Nota: Esta función reemplaza a PassThruWriteMsgs, que se utilizaba en versiones anteriores de la SAE J2534 API (v04.04).
long PassThruQueueMsgs(
    unsigned long ChannelID,
    PASSTHRU_MSG *pMsg,
    unsigned long *pNumMsgs
)

Características de funcionamiento

Características para canales lógicos ISO 15765

Los canales lógicos ISO 15765 pueden encolar una trama única (single frame) cuya dirección de red o TxFlags no coincidan con RemoteAddress o RemoteTxFlags indicados al crear el canal.

Importante: Intentar encolar un mensaje segmentado (multi-frame) con una dirección no coincidente provocará el error ERR_MSG_NOT_ALLOWED.

Parámetros

ChannelID

Parámetro de entrada. Identificador del canal de comunicación físico o lógico, obtenido al llamar a PassThruConnect() o PassThruLogicalConnect().

pMsg

Parámetro de entrada. Puntero a un array de estructuras PASSTHRU_MSG, asignado por la aplicación, que contiene los mensajes a encolar.

pNumMsgs

Parámetro de entrada/salida. Puntero a una variable unsigned long:

Códigos de error devueltos

Código Descripción
STATUS_NOERROR La función se ejecutó con éxito. Todos los mensajes fueron encolados.
ERR_CONCURRENT_API_CALL Se llamó a una función de la J2534 API antes de finalizar la llamada anterior
ERR_DEVICE_NOT_OPEN PassThruOpen() no se llamó con éxito
ERR_INVALID_CHANNEL_ID Valor de ChannelID no válido
ERR_DEVICE_NOT_CONNECTED Error de comunicación con el dispositivo pass-thru. El dispositivo se ha desconectado.
ERR_NOT_SUPPORTED El dispositivo no admite esta función para el ChannelID indicado
ERR_NULL_PARAMETER pMsg o pNumMsgs es NULL
ERR_MSG_PROTOCOL_ID ProtocolID en la estructura PASSTHRU_MSG no coincide con el ProtocolID del canal
ERR_INVALID_MSG La estructura del mensaje no es válida para el ChannelID indicado
ERR_MSG_NOT_ALLOWED Intento de encolar un mensaje segmentado con dirección/flags no coincidentes con los parámetros del canal lógico ISO 15765
ERR_BUFFER_FULL La cola de envío está llena. pNumMsgs contiene el número de mensajes realmente encolados.
ERR_FAILED Error indeterminado. Utilice PassThruGetLastError() para obtener la descripción.

Ejemplos

Ejemplo en C/C++

#include "j2534_dll.hpp"

unsigned long channelID = ...; // ID del canal de PassThruConnect/PassThruLogicalConnect

// Preparación del mensaje
PASSTHRU_MSG msg = {0};
msg.ProtocolID = ISO15765;
msg.TxFlags = ISO15765_FRAME_PAD;

// Datos: solicitud UDS Read Data By Identifier (0x22)
unsigned char data[] = {0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90};
memcpy(msg.Data, data, sizeof(data));
msg.DataSize = sizeof(data);

unsigned long numMsgs = 1;

// Encolamos el mensaje
long ret = PassThruQueueMsgs(channelID, &msg, &numMsgs);

if (ret == STATUS_NOERROR) {
    printf("Mensajes en la cola: %lu\n", numMsgs);
} else if (ret == ERR_BUFFER_FULL) {
    printf("Cola llena, mensajes encolados: %lu\n", numMsgs);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Error: %s\n", error);
}

Ejemplo en Python (ctypes)

from ctypes import *

j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")

# Estructura PASSTHRU_MSG
class PASSTHRU_MSG(Structure):
    _fields_ = [
        ("ProtocolID", c_ulong),
        ("RxStatus", c_ulong),
        ("TxFlags", c_ulong),
        ("Timestamp", c_ulong),
        ("DataSize", c_ulong),
        ("ExtraDataIndex", c_ulong),
        ("Data", c_ubyte * 4128)
    ]

channel_id = c_ulong(...)  # ID del canal

# Preparación del mensaje
msg = PASSTHRU_MSG()
msg.ProtocolID = 0x06  # ISO15765
msg.TxFlags = 0x40     # ISO15765_FRAME_PAD

# Solicitud UDS Read Data By Identifier
data = bytes([0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90])
for i, b in enumerate(data):
    msg.Data[i] = b
msg.DataSize = len(data)

num_msgs = c_ulong(1)

# Encolamos el mensaje
ret = j2534.PassThruQueueMsgs(channel_id, byref(msg), byref(num_msgs))

if ret == 0:  # STATUS_NOERROR
    print(f"Mensajes en la cola: {num_msgs.value}")
elif ret == 0x11:  # ERR_BUFFER_FULL
    print(f"Cola llena, encolados: {num_msgs.value}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Error: {error.value.decode()}")

Comparación con PassThruWriteMsgs (v04.04)

Característica PassThruWriteMsgs (v04.04) PassThruQueueMsgs (v05.00)
Comportamiento Llamada bloqueante con tiempo de espera No bloqueante, retorno inmediato
Parámetro Timeout Sí No
Soporte de canales lógicos No Sí

Funciones relacionadas