Quantex GmbH
Twój region: Europa

PassThruQueueMsgs v5.0

Umieszczanie komunikatów w kolejce kanału do transmisji

Ostatnia modyfikacja:

Opis

Funkcja umieszcza komunikaty w kolejce wysyłania urządzenia pass-thru dla wskazanego kanału. Przy pomyślnym wykonaniu zwracana jest wartość STATUS_NOERROR, a wartość wskazywana przez pNumMsgs jest aktualizowana i zawiera rzeczywistą liczbę komunikatów umieszczonych w kolejce.

Uwaga: Ta funkcja zastępuje PassThruWriteMsgs, która była używana w poprzednich wersjach SAE J2534 API (v04.04).
long PassThruQueueMsgs(
    unsigned long ChannelID,
    PASSTHRU_MSG *pMsg,
    unsigned long *pNumMsgs
)

Cechy działania

Cechy dla kanałów logicznych ISO 15765

Kanały logiczne ISO 15765 mogą umieszczać w kolejce pojedynczą ramkę (single frame), której adres sieciowy lub TxFlags nie są zgodne z RemoteAddress lub RemoteTxFlags wskazanymi podczas tworzenia kanału.

Ważne: Próba umieszczenia w kolejce komunikatu segmentowanego (multi-frame) z niezgodnym adresem spowoduje błąd ERR_MSG_NOT_ALLOWED.

Parametry

ChannelID

Parametr wejściowy. Identyfikator fizycznego lub logicznego kanału komunikacyjnego, uzyskany przy wywołaniu PassThruConnect() lub PassThruLogicalConnect().

pMsg

Parametr wejściowy. Wskaźnik na tablicę struktur PASSTHRU_MSG, przydzieloną przez aplikację, zawierającą komunikaty do umieszczenia w kolejce.

pNumMsgs

Parametr wejściowy/wyjściowy. Wskaźnik na zmienną unsigned long:

Zwracane kody błędów

Kod Opis
STATUS_NOERROR Funkcja wykonana pomyślnie. Wszystkie komunikaty umieszczone w kolejce.
ERR_CONCURRENT_API_CALL Funkcja J2534 API została wywołana przed zakończeniem poprzedniego wywołania
ERR_DEVICE_NOT_OPEN PassThruOpen() nie został pomyślnie wywołany
ERR_INVALID_CHANNEL_ID Niedozwolona wartość ChannelID
ERR_DEVICE_NOT_CONNECTED Błąd komunikacji z urządzeniem pass-thru. Urządzenie zostało odłączone.
ERR_NOT_SUPPORTED Urządzenie nie obsługuje tej funkcji dla danego ChannelID
ERR_NULL_PARAMETER pMsg lub pNumMsgs ma wartość NULL
ERR_MSG_PROTOCOL_ID ProtocolID w strukturze PASSTHRU_MSG nie odpowiada ProtocolID kanału
ERR_INVALID_MSG Struktura komunikatu jest niedozwolona dla danego ChannelID
ERR_MSG_NOT_ALLOWED Próba umieszczenia w kolejce komunikatu segmentowanego z adresem/flagami niezgodnymi z parametrami kanału logicznego ISO 15765
ERR_BUFFER_FULL Kolejka wysyłania jest pełna. pNumMsgs zawiera liczbę komunikatów rzeczywiście umieszczonych w kolejce.
ERR_FAILED Nieokreślony błąd. Użyj PassThruGetLastError(), aby uzyskać opis.

Przykłady

Przykład w C/C++

#include "j2534_dll.hpp"

unsigned long channelID = ...; // ID kanału z PassThruConnect/PassThruLogicalConnect

// Przygotowanie komunikatu
PASSTHRU_MSG msg = {0};
msg.ProtocolID = ISO15765;
msg.TxFlags = ISO15765_FRAME_PAD;

// Dane: żądanie 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;

// Umieszczamy komunikat w kolejce
long ret = PassThruQueueMsgs(channelID, &msg, &numMsgs);

if (ret == STATUS_NOERROR) {
    printf("Komunikatów w kolejce: %lu\n", numMsgs);
} else if (ret == ERR_BUFFER_FULL) {
    printf("Kolejka pełna, umieszczono komunikatów: %lu\n", numMsgs);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Błąd: %s\n", error);
}

Przykład w Pythonie (ctypes)

from ctypes import *

j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")

# Struktura 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 kanału

# Przygotowanie komunikatu
msg = PASSTHRU_MSG()
msg.ProtocolID = 0x06  # ISO15765
msg.TxFlags = 0x40     # ISO15765_FRAME_PAD

# Żądanie 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)

# Umieszczamy komunikat w kolejce
ret = j2534.PassThruQueueMsgs(channel_id, byref(msg), byref(num_msgs))

if ret == 0:  # STATUS_NOERROR
    print(f"Komunikatów w kolejce: {num_msgs.value}")
elif ret == 0x11:  # ERR_BUFFER_FULL
    print(f"Kolejka pełna, umieszczono: {num_msgs.value}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Błąd: {error.value.decode()}")

Porównanie z PassThruWriteMsgs (v04.04)

Charakterystyka PassThruWriteMsgs (v04.04) PassThruQueueMsgs (v05.00)
Zachowanie Wywołanie blokujące z limitem czasu Nieblokujące, natychmiastowy zwrot
Parametr Timeout Jest Brak
Obsługa kanałów logicznych Brak Tak

Funkcje powiązane