Encolado de mensajes en la cola del canal para su transmisión
Última modificació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.
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
)
pMsg no se modificanPassThruStartPeriodicMsg)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.
ERR_MSG_NOT_ALLOWED.
Parámetro de entrada. Identificador del canal de comunicación físico o lógico, obtenido al llamar a
PassThruConnect() o PassThruLogicalConnect().
Parámetro de entrada. Puntero a un array de estructuras PASSTHRU_MSG, asignado por la aplicación, que contiene los mensajes a encolar.
Parámetro de entrada/salida. Puntero a una variable unsigned long:
| 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. |
#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);
}
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()}")
| 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í |
PassThruReadMsgs() - Lectura de mensajes del canalPassThruStartPeriodicMsg() - Inicio de un mensaje periódico (mayor prioridad)PassThruSelect() - Selección de canales para monitorizaciónPassThruLogicalConnect() - Creación de un canal lógico