Auswahl von Kanälen zur Nachrichtenüberwachung
Letzte Änderung:
Die Funktion ermöglicht es der Anwendung, Kanäle zur Überwachung verfügbarer Nachrichten (einschließlich Indikationen) auszuwählen. Die Anwendung kann eine beliebige Kombination aus physischen und logischen Kommunikationskanälen, die minimale Anzahl von Kanälen mit verfügbaren Nachrichten sowie einen Timeout angeben.
Die Funktion kehrt erst zurück, wenn eine der folgenden Bedingungen eintritt:
Timeout ist abgelaufenChannelList mit verfügbaren Nachrichten erreicht oder übersteigt ChannelThresholdlong PassThruSelect(
SCHANNELSET *ChannelSetPtr,
unsigned long SelectType,
unsigned long Timeout
)
PassThruSelect ermöglicht es der Anwendung,
die Verfügbarkeit von Nachrichten auf mehreren Kanälen zu prüfen und darauf zu warten, ohne ständig
PassThruReadMsgs aufzurufen. Dies minimiert den Datenaustausch zwischen Anwendung und Gerät
und erhöht die Leistung.
PassThruSelect gibt die Nachrichten
NICHT selbst zurück — nur die Information darüber, welche Kanäle verfügbare Nachrichten haben.
Um die Nachrichten abzurufen, muss PassThruReadMsgs aufgerufen werden.
Eingabeparameter. Zeiger auf eine von der Anwendung zugewiesene SCHANNELSET-Struktur.
Eingabeparameter. Gibt den Zweck der Kanalauswahl an. Einziger zulässiger Wert:
| Wert | Beschreibung |
|---|---|
READABLE_TYPE |
Überwachung der Kanäle auf verfügbare Nachrichten (eingehende Nachrichten oder Indikationen) |
Eingabeparameter. Minimale Wartezeit (in Millisekunden) auf die Verfügbarkeit der erforderlichen Anzahl von Nachrichten.
ChannelThreshold = 0)typedef struct {
unsigned long ChannelCount; // Anzahl der Kanäle in der Liste
unsigned long ChannelThreshold; // Minimale Anzahl der Kanäle mit Nachrichten
unsigned long *ChannelList; // Zeiger auf das Array der Kanal-IDs
} SCHANNELSET;
| Feld | Ein/Aus | Beschreibung |
|---|---|---|
ChannelCount |
Ein/Aus | Beim Aufruf: Anzahl der Kanäle in ChannelList.Bei der Rückkehr: Anzahl der in ChannelList verbleibenden Kanäle (mit verfügbaren Nachrichten). |
ChannelThreshold |
Ein | Minimale Anzahl von Kanälen, die mindestens eine verfügbare Nachricht haben müssen.
Wert 0 — die Funktion kehrt sofort zurück (entspricht Timeout = 0).
Muss ≤ ChannelCount sein. |
ChannelList |
Ein/Aus | Beim Aufruf: Zeiger auf ein Array von Kanal-IDs (physisch und/oder logisch) zur Überwachung. Bei der Rückkehr: Teilmenge der ursprünglichen Liste — nur Kanäle mit verfügbaren Nachrichten (Reihenfolge nicht garantiert). |
| Code | Beschreibung |
|---|---|
| STATUS_NOERROR | Funktion erfolgreich ausgeführt. ChannelList enthält die Kanäle mit verfügbaren Nachrichten. |
| ERR_CONCURRENT_API_CALL | J2534 API-Funktion wurde vor Abschluss des vorherigen Aufrufs aufgerufen |
| ERR_DEVICE_NOT_OPEN | PassThruOpen() wurde nicht erfolgreich aufgerufen |
| ERR_NULL_PARAMETER | ChannelSetPtr oder ChannelList ist NULL |
| ERR_INVALID_CHANNEL_ID | Eine der Kanal-IDs in ChannelList ist ungültig. Die SCHANNELSET-Struktur wird nicht verändert. |
| ERR_DEVICE_NOT_CONNECTED | Kommunikationsfehler mit dem Pass-Thru-Gerät. Das Gerät wurde getrennt. |
| ERR_NOT_SUPPORTED | Die DLL unterstützt diese Funktion nicht |
| ERR_SELECT_TYPE_NOT_SUPPORTED | Der Wert von SelectType ist unzulässig oder unbekannt |
| ERR_EXCEEDED_LIMIT | Der Wert von ChannelThreshold ist größer als ChannelCount |
| ERR_BUFFER_EMPTY | Auf keinem der angegebenen Kanäle sind Nachrichten verfügbar |
| ERR_TIMEOUT | Der Timeout ist abgelaufen und die Anzahl der Kanäle mit Nachrichten ist kleiner als ChannelThreshold.
Gilt nur bei einem Timeout ungleich null und wenn mindestens eine Nachricht vorliegt. |
| ERR_FAILED | Unbestimmter Fehler. Verwenden Sie PassThruGetLastError(), um eine Beschreibung zu erhalten. |
#include "j2534_dll.hpp"
// Kanal-IDs von PassThruConnect/PassThruLogicalConnect erhalten
unsigned long canChannelID = ...;
unsigned long isoChannelID = ...;
// Array der zu überwachenden Kanäle
unsigned long channels[2] = { canChannelID, isoChannelID };
// Struktur für PassThruSelect
SCHANNELSET channelSet;
channelSet.ChannelCount = 2;
channelSet.ChannelThreshold = 1; // Auf mindestens 1 Kanal mit Nachricht warten
channelSet.ChannelList = channels;
// Bis zu 1000 ms auf Nachrichten warten
long ret = PassThruSelect(&channelSet, READABLE_TYPE, 1000);
if (ret == STATUS_NOERROR) {
printf("Kanäle mit Nachrichten: %lu\n", channelSet.ChannelCount);
// Nachrichten von Kanälen mit Daten lesen
for (unsigned long i = 0; i < channelSet.ChannelCount; i++) {
unsigned long channelID = channelSet.ChannelList[i];
printf("Kanal %lu hat Nachrichten\n", channelID);
// Nachrichten lesen
PASSTHRU_MSG msg[10];
unsigned long numMsgs = 10;
ret = PassThruReadMsgs(channelID, msg, &numMsgs, 0);
// ...Nachrichtenverarbeitung...
}
} else if (ret == ERR_BUFFER_EMPTY) {
printf("Keine Nachrichten verfügbar\n");
} else if (ret == ERR_TIMEOUT) {
printf("Timeout, aber %lu Kanäle mit Nachrichten vorhanden\n", channelSet.ChannelCount);
} else {
char error[256];
PassThruGetLastError(error);
printf("Fehler: %s\n", error);
}
from ctypes import *
j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")
# SCHANNELSET-Struktur
class SCHANNELSET(Structure):
_fields_ = [
("ChannelCount", c_ulong),
("ChannelThreshold", c_ulong),
("ChannelList", POINTER(c_ulong))
]
# Kanal-IDs
can_channel_id = c_ulong(...) # von PassThruConnect
iso_channel_id = c_ulong(...) # von PassThruLogicalConnect
# Kanal-Array
channels = (c_ulong * 2)(can_channel_id.value, iso_channel_id.value)
# Struktur für PassThruSelect
channel_set = SCHANNELSET()
channel_set.ChannelCount = 2
channel_set.ChannelThreshold = 1
channel_set.ChannelList = channels
READABLE_TYPE = 0x01
# Bis zu 1000 ms auf Nachrichten warten
ret = j2534.PassThruSelect(byref(channel_set), READABLE_TYPE, 1000)
if ret == 0: # STATUS_NOERROR
print(f"Kanäle mit Nachrichten: {channel_set.ChannelCount}")
for i in range(channel_set.ChannelCount):
print(f"Kanal {channel_set.ChannelList[i]} hat Nachrichten")
elif ret == 0x10: # ERR_BUFFER_EMPTY
print("Keine Nachrichten verfügbar")
elif ret == 0x09: # ERR_TIMEOUT
print(f"Timeout, Kanäle mit Nachrichten: {channel_set.ChannelCount}")
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Fehler: {error.value.decode()}")
PassThruReadMsgs() - Lesen von Nachrichten aus dem KanalPassThruConnect() - Aufbau einer physischen VerbindungPassThruLogicalConnect() - Erstellen eines logischen Kanals