Quantex GmbH
Ihre Region: Europa

PassThruWriteMsgs v4.04

Senden von Nachrichten

Letzte Änderung:

Beschreibung

Die Funktion sendet Nachrichten über das Diagnoseprotokoll. Die Sendewarteschlange des Adapters ist auf 50 Nachrichten pro Warteschlange für einen Kanal ausgelegt und verfügt über 64 KByte freien Speicher für alle Warteschlangen. Sobald die Warteschlange oder der gesamte freie Speicher gefüllt ist, wird die Aufnahme von Nachrichten in die Sendewarteschlange angehalten.

long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
Wichtig: Für das Protokoll ISO 15765 muss vor dem Senden von Nachrichten mit PassThruStartMsgFilter ein Flow-Control-Filter eingerichtet werden. Ohne diesen gibt die Funktion den Fehler ERR_NO_FLOW_CONTROL zurück.

Parameter

Rückgabe-Fehlercodes

Code Beschreibung Mögliche Ursachen und Lösungen
STATUS_NOERROR Funktion erfolgreich ausgeführt
ERR_DEVICE_NOT_CONNECTED Keine Verbindung zum Adapter
  • Adapter ausgeschaltet oder Verbindung verloren
  • Lösung: Prüfen Sie die Stromversorgung des Adapters und die Netzwerk-/BLE-Verbindung
  • IP-Adresse falsch angegeben
  • Lösung: Prüfen Sie die Verbindungsparameter in PassThruOpen
ERR_INVALID_CHANNEL_ID Es wurde eine nicht existierende Kanalkennung ChannelID angegeben
  • ChannelID wurde nicht von PassThruConnect bezogen
  • Lösung: Verwenden Sie die von der Funktion PassThruConnect zurückgegebene ChannelID
  • Der Kanal wurde über PassThruDisconnect geschlossen
  • Lösung: Öffnen Sie den Kanal erneut über PassThruConnect
ERR_NULL_PARAMETER Zeiger pMsg oder pNumMsgs nicht angegeben
  • Statt eines Zeigers wurde NULL übergeben
  • Lösung: Übergeben Sie einen gültigen Zeiger auf das Nachrichten-Array und auf die Variable für die Anzahl
ERR_TIMEOUT Innerhalb der vorgegebenen Zeit konnten nicht alle Nachrichten gesendet werden
  • Zu viele Nachrichten oder zu kurzer Timeout
  • Lösung: Erhöhen Sie den Wert von Timeout oder verringern Sie die Anzahl der Nachrichten
  • Probleme auf dem Bus (keine CAN-Bestätigung)
  • Lösung: Prüfen Sie die Verbindung zum Fahrzeug und den Zustand des Busses
ERR_INVALID_MSG Ungültige Nachrichtenstruktur in pMsg
  • Ungültige Daten oder Nachrichtengröße
  • Lösung: Prüfen Sie die Felder DataSize, Data und TxFlags in der Struktur PASSTHRU_MSG
ERR_MSG_PROTOCOL_ID Das Protokoll in der Nachricht stimmt nicht mit dem Protokoll des Kanals überein
  • ProtocolID in der Nachrichtenstruktur weicht von dem in PassThruConnect angegebenen ab
  • Lösung: Setzen Sie in pMsg->ProtocolID dasselbe Protokoll, das beim Öffnen des Kanals verwendet wurde
ERR_NO_FLOW_CONTROL Für das Protokoll ISO 15765 ist kein Flow-Control-Filter eingerichtet
  • Versuch, eine ISO-15765-Nachricht ohne konfigurierten Filter zu senden
  • Lösung: Rufen Sie vor dem Senden PassThruStartMsgFilter mit dem Typ FLOW_CONTROL_FILTER auf
ERR_BUFFER_FULL Sendewarteschlange übergelaufen
  • Zu viele Nachrichten in der Warteschlange (Limit: 50 Nachrichten, 64 KB)
  • Lösung: Warten Sie das Senden der vorherigen Nachrichten ab oder leeren Sie die Warteschlange über PassThruIoctl(CLEAR_TX_BUFFER)
ERR_FAILED Interner Fehler in der Bibliothek oder im Adapter
  • Fehler bei der Speicherzuweisung oder Stack-Ausfall
  • Lösung: Rufen Sie PassThruGetLastError() auf, um Details zu erhalten

Beispiele

Beispiel in C/C++

#include "j2534_dll.hpp"

// ChannelID zuvor von PassThruConnect erhalten
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;

// Erstellen einer ISO-15765-Nachricht (Anfrage 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);
    // Fehlerbehandlung
}

Beispiel in Kotlin (Android)

// channelID zuvor von ptConnect erhalten
val msg = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 7,
    txFlags = ISO15765_FRAME_PAD,
    // VIN-Anfrage (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", "Gesendete Nachrichten: ${result.numMsgs}")
} else {
    Log.e("J2534", "Sendefehler: ${result.status}")
}

Beispiel in Python

# channel_id zuvor von PassThruConnect erhalten
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"Gesendete Nachrichten: {num_msgs.value}")
else:
    print(f"Sendefehler: {ret}")

Beispiel in C#

// channelId zuvor von PassThruConnect erhalten
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($"Gesendete Nachrichten: {numMsgs}");
} else {
    Console.WriteLine($"Sendefehler: {ret}");
}