Quantex GmbH
Twój region: Europa

PassThruWriteMsgs v4.04

Przesyłanie wiadomości

Ostatnia zmiana:

Opis

Funkcja przesyła wiadomości za pomocą protokołu diagnostycznego. Kolejka nadawcza adaptera jest przeznaczona na 50 wiadomości w jednej kolejce dla jednego kanału i dysponuje 64 KB wolnej pamięci dla wszystkich kolejek. Po zapełnieniu kolejki lub całej wolnej pamięci przyjmowanie wiadomości do kolejki nadawczej zostaje wstrzymane.

long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
Ważne: W przypadku protokołu ISO 15765 przed przesłaniem wiadomości należy ustawić filtr Flow Control za pomocą PassThruStartMsgFilter. Bez niego funkcja zwróci błąd ERR_NO_FLOW_CONTROL.

Parametry

Zwracane kody błędów

Kod Opis Możliwe przyczyny i rozwiązania
STATUS_NOERROR Funkcja wykonana pomyślnie
ERR_DEVICE_NOT_CONNECTED Brak połączenia z adapterem
  • Adapter jest wyłączony lub utracono połączenie
  • Rozwiązanie: Sprawdź zasilanie adaptera oraz połączenie sieciowe/BLE
  • Nieprawidłowo podany adres IP
  • Rozwiązanie: Sprawdź parametry połączenia w PassThruOpen
ERR_INVALID_CHANNEL_ID Podano nieistniejący identyfikator kanału ChannelID
  • ChannelID nie został uzyskany od PassThruConnect
  • Rozwiązanie: Użyj ChannelID zwróconego przez funkcję PassThruConnect
  • Kanał został zamknięty przez PassThruDisconnect
  • Rozwiązanie: Otwórz kanał ponownie za pomocą PassThruConnect
ERR_NULL_PARAMETER Nie podano wskaźnika pMsg lub pNumMsgs
  • Przekazano NULL zamiast wskaźnika
  • Rozwiązanie: Przekaż prawidłowy wskaźnik do tablicy wiadomości oraz zmiennej liczby
ERR_TIMEOUT W zadanym czasie nie udało się przesłać wszystkich wiadomości
  • Zbyt wiele wiadomości lub zbyt krótki limit czasu
  • Rozwiązanie: Zwiększ wartość Timeout lub zmniejsz liczbę wiadomości
  • Problemy na magistrali (brak potwierdzenia CAN)
  • Rozwiązanie: Sprawdź połączenie z pojazdem oraz stan magistrali
ERR_INVALID_MSG Nieprawidłowa struktura wiadomości w pMsg
  • Nieprawidłowe dane lub rozmiar wiadomości
  • Rozwiązanie: Sprawdź pola DataSize, Data oraz TxFlags w strukturze PASSTHRU_MSG
ERR_MSG_PROTOCOL_ID Protokół w wiadomości nie zgadza się z protokołem kanału
  • ProtocolID w strukturze wiadomości różni się od podanego w PassThruConnect
  • Rozwiązanie: Ustaw w pMsg->ProtocolID ten sam protokół, który został użyty przy otwieraniu kanału
ERR_NO_FLOW_CONTROL Dla protokołu ISO 15765 nie ustawiono filtra Flow Control
  • Próba przesłania wiadomości ISO 15765 bez skonfigurowanego filtra
  • Rozwiązanie: Wywołaj PassThruStartMsgFilter z typem FLOW_CONTROL_FILTER przed przesłaniem
ERR_BUFFER_FULL Kolejka nadawcza jest przepełniona
  • Zbyt wiele wiadomości w kolejce (limit: 50 wiadomości, 64 KB)
  • Rozwiązanie: Poczekaj na wysłanie poprzednich wiadomości lub wyczyść kolejkę za pomocą PassThruIoctl(CLEAR_TX_BUFFER)
ERR_FAILED Wewnętrzny błąd biblioteki lub adaptera
  • Błąd alokacji pamięci lub awaria stosu
  • Rozwiązanie: Wywołaj PassThruGetLastError(), aby uzyskać szczegóły

Przykłady

Przykład w C/C++

#include "j2534_dll.hpp"

// ChannelID uzyskany wcześniej od PassThruConnect
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;

// Tworzenie wiadomości ISO 15765 (żądanie SID 0x22, PID 0xF190)
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF;
Msg.Data[4] = 0x22;
Msg.Data[5] = 0xF1;
Msg.Data[6] = 0x90;
Msg.DataSize = 7;

long ret = PassThruWriteMsg(ChannelID, &Msg, &NumMsgs, Timeout);
if (ret != STATUS_NOERROR) {
    char error[256];
    PassThruGetLastError(error);
    // Obsługa błędu
}

Przykład w Kotlin (Android)

// channelID uzyskany wcześniej od ptConnect
val msg = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 7,
    txFlags = ISO15765_FRAME_PAD,
    // Żądanie VIN (SID 0x22, PID 0xF190)
    data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x22, 0xF1.toByte(), 0x90.toByte())
)

val messages = arrayOf(msg)
val timeout = 200 // ms

val result = j2534.ptWriteMsgs(channelID, messages, timeout)
if (result.status == STATUS_NOERROR) {
    Log.i("J2534", "Wysłano wiadomości: ${result.numMsgs}")
} else {
    Log.e("J2534", "Błąd wysyłania: ${result.status}")
}

Przykład w Python

# channel_id uzyskany wcześniej od PassThruConnect
msg = PassThruMsg()
msg.ProtocolID = ISO15765
msg.TxFlags = ISO15765_FRAME_PAD
msg.Data = bytes([0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90])
msg.DataSize = 7

num_msgs = ctypes.c_ulong(1)
timeout = 200  # ms

ret = j2534.PassThruWriteMsg(channel_id, ctypes.byref(msg), ctypes.byref(num_msgs), timeout)
if ret == 0:  # STATUS_NOERROR
    print(f"Wysłano wiadomości: {num_msgs.value}")
else:
    print(f"Błąd wysyłania: {ret}")

Przykład w C#

// channelId uzyskany wcześniej od PassThruConnect
var msg = new PassThruMsg {
    ProtocolID = ISO15765,
    TxFlags = ISO15765_FRAME_PAD,
    Data = new byte[] { 0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90 },
    DataSize = 7
};

uint numMsgs = 1;
uint timeout = 200; // ms

int ret = J2534.PassThruWriteMsg(channelId, ref msg, ref numMsgs, timeout);
if (ret == 0) {
    Console.WriteLine($"Wysłano wiadomości: {numMsgs}");
} else {
    Console.WriteLine($"Błąd wysyłania: {ret}");
}