Umieszczanie komunikatów w kolejce kanału do transmisji
Ostatnia modyfikacja:
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.
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
)
pMsg, nie są modyfikowanePassThruStartPeriodicMsg)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.
ERR_MSG_NOT_ALLOWED.
Parametr wejściowy. Identyfikator fizycznego lub logicznego kanału komunikacyjnego, uzyskany przy wywołaniu
PassThruConnect() lub PassThruLogicalConnect().
Parametr wejściowy. Wskaźnik na tablicę struktur PASSTHRU_MSG, przydzieloną przez aplikację, zawierającą komunikaty do umieszczenia w kolejce.
Parametr wejściowy/wyjściowy. Wskaźnik na zmienną unsigned long:
| 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. |
#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);
}
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()}")
| 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 |
PassThruReadMsgs() - Odczyt komunikatów z kanałuPassThruStartPeriodicMsg() - Uruchomienie komunikatu okresowego (wyższy priorytet)PassThruSelect() - Wybór kanałów do monitorowaniaPassThruLogicalConnect() - Utworzenie kanału logicznego