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 No
Soporte de canales lógicos No

Funciones relacionadas