Einreihen von Nachrichten in die Sendewarteschlange des Kanals
Letzte Änderung:
Die Funktion stellt Nachrichten in die Sendewarteschlange des Pass-Thru-Geräts für den angegebenen Kanal.
Bei erfolgreicher Ausführung wird STATUS_NOERROR zurückgegeben, und der Wert am Zeiger pNumMsgs
wird aktualisiert und enthält die tatsächliche Anzahl der in die Warteschlange eingereihten Nachrichten.
PassThruWriteMsgs,
die in früheren Versionen des SAE J2534 API (v04.04) verwendet wurde.
long PassThruQueueMsgs(
unsigned long ChannelID,
PASSTHRU_MSG *pMsg,
unsigned long *pNumMsgs
)
pMsg verweist, werden nicht verändertPassThruStartPeriodicMsg)Logische ISO 15765-Kanäle können einen einzelnen Frame (Single Frame) in die Warteschlange einreihen, dessen Netzwerkadresse oder
TxFlags nicht mit den bei der Kanalerstellung angegebenen RemoteAddress bzw. RemoteTxFlags
übereinstimmen.
ERR_MSG_NOT_ALLOWED.
Eingabeparameter. Kennung des physischen oder logischen Kommunikationskanals, die beim Aufruf von
PassThruConnect() oder PassThruLogicalConnect() zurückgegeben wurde.
Eingabeparameter. Zeiger auf ein von der Anwendung zugewiesenes Array von PASSTHRU_MSG-Strukturen,
das die in die Warteschlange einzureihenden Nachrichten enthält.
Ein-/Ausgabeparameter. Zeiger auf eine unsigned long-Variable:
| Code | Beschreibung |
|---|---|
| STATUS_NOERROR | Funktion erfolgreich ausgeführt. Alle Nachrichten wurden in die Warteschlange eingereiht. |
| ERR_CONCURRENT_API_CALL | J2534 API-Funktion wurde vor Abschluss des vorherigen Aufrufs aufgerufen |
| ERR_DEVICE_NOT_OPEN | PassThruOpen() wurde nicht erfolgreich aufgerufen |
| ERR_INVALID_CHANNEL_ID | Unzulässiger Wert für ChannelID |
| ERR_DEVICE_NOT_CONNECTED | Kommunikationsfehler mit dem Pass-Thru-Gerät. Das Gerät wurde getrennt. |
| ERR_NOT_SUPPORTED | Das Gerät unterstützt diese Funktion für die angegebene ChannelID nicht |
| ERR_NULL_PARAMETER | pMsg oder pNumMsgs ist NULL |
| ERR_MSG_PROTOCOL_ID | ProtocolID in der PASSTHRU_MSG-Struktur stimmt nicht mit der ProtocolID des Kanals überein |
| ERR_INVALID_MSG | Die Nachrichtenstruktur ist für die angegebene ChannelID nicht zulässig |
| ERR_MSG_NOT_ALLOWED | Versuch, eine segmentierte Nachricht mit Adresse/Flags einzureihen, die nicht den Parametern des logischen ISO 15765-Kanals entsprechen |
| ERR_BUFFER_FULL | Die Sendewarteschlange ist voll. pNumMsgs enthält die Anzahl der tatsächlich eingereihten Nachrichten. |
| ERR_FAILED | Unbestimmter Fehler. Verwenden Sie PassThruGetLastError(), um eine Beschreibung zu erhalten. |
#include "j2534_dll.hpp"
unsigned long channelID = ...; // Kanal-ID von PassThruConnect/PassThruLogicalConnect
// Nachricht vorbereiten
PASSTHRU_MSG msg = {0};
msg.ProtocolID = ISO15765;
msg.TxFlags = ISO15765_FRAME_PAD;
// Daten: UDS-Anfrage 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;
// Nachricht in die Warteschlange einreihen
long ret = PassThruQueueMsgs(channelID, &msg, &numMsgs);
if (ret == STATUS_NOERROR) {
printf("Nachrichten in Warteschlange: %lu\n", numMsgs);
} else if (ret == ERR_BUFFER_FULL) {
printf("Warteschlange voll, eingereihte Nachrichten: %lu\n", numMsgs);
} else {
char error[256];
PassThruGetLastError(error);
printf("Fehler: %s\n", error);
}
from ctypes import *
j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")
# PASSTHRU_MSG-Struktur
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(...) # Kanal-ID
# Nachricht vorbereiten
msg = PASSTHRU_MSG()
msg.ProtocolID = 0x06 # ISO15765
msg.TxFlags = 0x40 # ISO15765_FRAME_PAD
# UDS-Anfrage 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)
# Nachricht in die Warteschlange einreihen
ret = j2534.PassThruQueueMsgs(channel_id, byref(msg), byref(num_msgs))
if ret == 0: # STATUS_NOERROR
print(f"Nachrichten in Warteschlange: {num_msgs.value}")
elif ret == 0x11: # ERR_BUFFER_FULL
print(f"Warteschlange voll, eingereiht: {num_msgs.value}")
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Fehler: {error.value.decode()}")
| Merkmal | PassThruWriteMsgs (v04.04) | PassThruQueueMsgs (v05.00) |
|---|---|---|
| Verhalten | Blockierender Aufruf mit Timeout | Nicht blockierend, sofortige Rückkehr |
| Timeout-Parameter | Ja | Nein |
| Unterstützung logischer Kanäle | Nein | Ja |
PassThruReadMsgs() - Lesen von Nachrichten aus dem KanalPassThruStartPeriodicMsg() - Starten einer periodischen Nachricht (höhere Priorität)PassThruSelect() - Auswahl von Kanälen zur ÜberwachungPassThruLogicalConnect() - Erstellen eines logischen Kanals