Selección de canales para la monitorización de mensajes
Última modificación:
La función permite a la aplicación seleccionar canales para monitorizar los mensajes disponibles (incluidas las indicaciones). La aplicación puede indicar cualquier combinación de canales de comunicación físicos y lógicos, el número mínimo de canales con mensajes disponibles y un tiempo de espera.
La función no devuelve el control hasta que ocurra una de las siguientes condiciones:
TimeoutChannelList con mensajes disponibles alcance o supere ChannelThresholdlong PassThruSelect(
SCHANNELSET *ChannelSetPtr,
unsigned long SelectType,
unsigned long Timeout
)
PassThruSelect permite a la aplicación comprobar y esperar la disponibilidad de mensajes en varios canales sin llamar continuamente a
PassThruReadMsgs. Esto minimiza el intercambio de datos entre la aplicación y el dispositivo, aumentando el rendimiento.
PassThruSelect NO devuelve los mensajes en sí, solo información sobre qué canales tienen mensajes disponibles. Para recibir los mensajes es necesario llamar a PassThruReadMsgs.
Parámetro de entrada. Puntero a una estructura SCHANNELSET asignada por la aplicación.
Parámetro de entrada. Indica la finalidad de la selección de canales. El único valor admitido es:
| Valor | Descripción |
|---|---|
READABLE_TYPE |
Monitorización de canales para detectar mensajes disponibles (mensajes entrantes o indicaciones) |
Parámetro de entrada. Tiempo mínimo de espera (en milisegundos) para la disponibilidad del número requerido de mensajes.
ChannelThreshold = 0)typedef struct {
unsigned long ChannelCount; // Número de canales en la lista
unsigned long ChannelThreshold; // Número mínimo de canales con mensajes
unsigned long *ChannelList; // Puntero al array de ID de canales
} SCHANNELSET;
| Campo | Entrada/Salida | Descripción |
|---|---|---|
ChannelCount |
Entrada/Salida | En la llamada: número de canales en ChannelList.En el retorno: número de canales que quedan en ChannelList (con mensajes disponibles). |
ChannelThreshold |
Entrada | Número mínimo de canales que deben tener al menos un mensaje disponible. Valor 0 — la función devuelve el control inmediatamente (equivalente a Timeout = 0). Debe ser ≤ ChannelCount. |
ChannelList |
Entrada/Salida | En la llamada: puntero al array de ID de canales (físicos y/o lógicos) que se van a monitorizar. En el retorno: subconjunto de la lista original — solo los canales con mensajes disponibles (no se garantiza el orden). |
| Código | Descripción |
|---|---|
| STATUS_NOERROR | La función se ejecutó correctamente. ChannelList contiene los canales con mensajes disponibles. |
| 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ó correctamente |
| ERR_NULL_PARAMETER | ChannelSetPtr o ChannelList es NULL |
| ERR_INVALID_CHANNEL_ID | Uno de los ID de canales en ChannelList no es válido. La estructura SCHANNELSET no se modifica. |
| ERR_DEVICE_NOT_CONNECTED | Error de comunicación con el dispositivo pass-thru. El dispositivo se ha desconectado. |
| ERR_NOT_SUPPORTED | La DLL no admite esta función |
| ERR_SELECT_TYPE_NOT_SUPPORTED | El valor de SelectType no es válido o es desconocido |
| ERR_EXCEEDED_LIMIT | El valor de ChannelThreshold es mayor que ChannelCount |
| ERR_BUFFER_EMPTY | No hay mensajes disponibles en ninguno de los canales indicados |
| ERR_TIMEOUT | El tiempo de espera ha transcurrido y el número de canales con mensajes es menor que ChannelThreshold. Solo se aplica con un Timeout distinto de cero y la presencia de al menos un mensaje. |
| ERR_FAILED | Error no especificado. Use PassThruGetLastError() para obtener la descripción. |
#include "j2534_dll.hpp"
// ID de canales obtenidos de PassThruConnect/PassThruLogicalConnect
unsigned long canChannelID = ...;
unsigned long isoChannelID = ...;
// Array de canales para monitorizar
unsigned long channels[2] = { canChannelID, isoChannelID };
// Estructura para PassThruSelect
SCHANNELSET channelSet;
channelSet.ChannelCount = 2;
channelSet.ChannelThreshold = 1; // Esperamos al menos 1 canal con mensaje
channelSet.ChannelList = channels;
// Esperamos mensajes hasta 1000 ms
long ret = PassThruSelect(&channelSet, READABLE_TYPE, 1000);
if (ret == STATUS_NOERROR) {
printf("Canales con mensajes: %lu\n", channelSet.ChannelCount);
// Leemos mensajes de los canales que tienen datos
for (unsigned long i = 0; i < channelSet.ChannelCount; i++) {
unsigned long channelID = channelSet.ChannelList[i];
printf("El canal %lu tiene mensajes\n", channelID);
// Leemos los mensajes
PASSTHRU_MSG msg[10];
unsigned long numMsgs = 10;
ret = PassThruReadMsgs(channelID, msg, &numMsgs, 0);
// ...procesamiento de los mensajes...
}
} else if (ret == ERR_BUFFER_EMPTY) {
printf("No hay mensajes disponibles\n");
} else if (ret == ERR_TIMEOUT) {
printf("Tiempo de espera agotado, pero hay %lu canales con mensajes\n", channelSet.ChannelCount);
} else {
char error[256];
PassThruGetLastError(error);
printf("Error: %s\n", error);
}
from ctypes import *
j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")
# Estructura SCHANNELSET
class SCHANNELSET(Structure):
_fields_ = [
("ChannelCount", c_ulong),
("ChannelThreshold", c_ulong),
("ChannelList", POINTER(c_ulong))
]
# ID de canales
can_channel_id = c_ulong(...) # de PassThruConnect
iso_channel_id = c_ulong(...) # de PassThruLogicalConnect
# Array de canales
channels = (c_ulong * 2)(can_channel_id.value, iso_channel_id.value)
# Estructura para PassThruSelect
channel_set = SCHANNELSET()
channel_set.ChannelCount = 2
channel_set.ChannelThreshold = 1
channel_set.ChannelList = channels
READABLE_TYPE = 0x01
# Esperamos mensajes hasta 1000 ms
ret = j2534.PassThruSelect(byref(channel_set), READABLE_TYPE, 1000)
if ret == 0: # STATUS_NOERROR
print(f"Canales con mensajes: {channel_set.ChannelCount}")
for i in range(channel_set.ChannelCount):
print(f"El canal {channel_set.ChannelList[i]} tiene mensajes")
elif ret == 0x10: # ERR_BUFFER_EMPTY
print("No hay mensajes disponibles")
elif ret == 0x09: # ERR_TIMEOUT
print(f"Tiempo de espera agotado, canales con mensajes: {channel_set.ChannelCount}")
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Error: {error.value.decode()}")
PassThruReadMsgs() - Lectura de mensajes de un canalPassThruConnect() - Creación de una conexión físicaPassThruLogicalConnect() - Creación de un canal lógico