Quantex GmbH
DE RU EN EL
Ihre Region: Europa

PassThruQueueMsgs v5.0

Einreihen von Nachrichten in die Sendewarteschlange des Kanals

Letzte Änderung:

Beschreibung

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.

Hinweis: Diese Funktion ersetzt 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
)

Funktionsweise

Besonderheiten für logische ISO 15765-Kanäle

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.

Wichtig: Der Versuch, eine segmentierte Nachricht (Multi-Frame) mit nicht übereinstimmender Adresse in die Warteschlange einzureihen, führt zum Fehler ERR_MSG_NOT_ALLOWED.

Parameter

ChannelID

Eingabeparameter. Kennung des physischen oder logischen Kommunikationskanals, die beim Aufruf von PassThruConnect() oder PassThruLogicalConnect() zurückgegeben wurde.

pMsg

Eingabeparameter. Zeiger auf ein von der Anwendung zugewiesenes Array von PASSTHRU_MSG-Strukturen, das die in die Warteschlange einzureihenden Nachrichten enthält.

pNumMsgs

Ein-/Ausgabeparameter. Zeiger auf eine unsigned long-Variable:

Rückgabe-Fehlercodes

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.

Beispiele

Beispiel in C/C++

#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);
}

Beispiel in Python (ctypes)

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()}")

Vergleich mit PassThruWriteMsgs (v04.04)

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

Verwandte Funktionen