Aufbau einer Verbindung über ein Protokoll
Letzte Änderung:
Die Funktion stellt eine Verbindung über das angegebene Protokoll her. Der Adapter unterstützt zwei unabhängige Diagnoseleitungen. Jedes Protokoll ist mit seiner Leitung verbunden. Leitung 1 ist mit den Pins 6 und 14 des OBD-Steckers verbunden, und an sie können nur die Protokolle
ISO15765 und CAN angeschlossen werden. Leitung 2 ist umschaltbar, und an sie können die übrigen Protokolle angeschlossen werden. Da die Leitungen unabhängig sind, ist der gleichzeitige Betrieb zweier Protokolle zulässig. Zum Beispiel ISO15765 und ISO14230 oder ISO15765 und ISO15765_PS. Der Zusatz PS bedeutet,
dass das Protokoll auf die Pins des OBD-Steckers umgeschaltet werden kann.
Die Protokolle ISO15765 und CAN sowie ISO15765_PS und CAN_PS können gleichzeitig auf einer physischen Leitung arbeiten. Das bedeutet, dass Sie in einem Adapter gleichzeitig
bis zu 4 Protokolle initialisieren können. Dabei ist zu beachten, dass die eingestellten Geschwindigkeiten für jedes Protokollpaar gleich sein müssen. Zum Beispiel ISO15765 und CAN mit einer Geschwindigkeit von 500 kBit an den Pins 6 und 14 des OBD-Steckers und ISO15765_PS und CAN_PS mit einer Geschwindigkeit von
125 kBit an den Pins 3 und 11.
long PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long BaudRate, unsigned long *pChannelID)
| Definition | Pins | Beschreibung |
|---|---|---|
| J1850VPW | 2 VPW | Definiert durch die Standards SAE J1850 und SAE J2178. Kann gleichzeitig mit CAN und ISO15765 arbeiten, nicht kompatibel mit umschaltbaren Protokollen. |
| J1850PWM | 2, 10 PWM | Definiert durch den Standard SAE J1850. Kann gleichzeitig mit CAN und ISO15765 arbeiten, nicht kompatibel mit umschaltbaren Protokollen. |
| ISO9141 | 7K,15L Line | Definiert durch die Standards ISO 9141 und SAE J1979. Kann gleichzeitig mit CAN und ISO15765 arbeiten, nicht kompatibel mit umschaltbaren Protokollen. |
| ISO14230 | 7K,15L Line | |
| CAN | 6H,14L CAN | Unverarbeiteter CAN-Datenstrom. Kann gleichzeitig mit allen Protokollen arbeiten. |
| ISO15765 | 6H,14L CAN | Definiert durch die Standards ISO 15765-4 und ISO 14229-1 UDS Kann gleichzeitig mit allen Protokollen arbeiten. |
| ISO15765_PS | Umschaltbares CAN | Umschaltbare Version von ISO 15765. Kann gleichzeitig mit CAN und ISO15765 arbeiten. |
| ISO13400_PS Quantex | Ethernet | DoIP (Diagnostics over IP) — Diagnose über Ethernet nach dem Standard ISO 13400. Näheres siehe Beschreibung von DoIP. |
| Die vollständige Liste der Protokolle finden Sie im Standard SAE J2534-1. | ||
| Name der Konstante | Bit | Beschreibung |
|---|---|---|
| ISO9141_K_LINE | 12 | Verwendung der L-Leitung zur Initialisierung der Protokolle. 0 = Es werden L-Leitung und K-Leitung zur Initialisierung verwendet 1 = Es wird nur die K-Leitung zur Initialisierung verwendet |
| CAN_29BIT_ID | 8 | Typ des CAN-Identifikators für die Protokolle CAN und ISO 15765 0 = Es werden Pakete mit 11-Bit-Identifikator empfangen. 1 = Es werden Pakete mit 29-Bit-Identifikator empfangen. |
| Die vollständige Liste der Flags finden Sie im Standard SAE J2534-1. | ||
| Code | Beschreibung | Mögliche Ursachen und Lösungen |
|---|---|---|
| STATUS_NOERROR | Funktion erfolgreich ausgeführt | — |
| ERR_DEVICE_NOT_CONNECTED | Keine Verbindung zum Adapter |
|
| ERR_INVALID_DEVICE_ID | Es wurde ein nicht existierender Adapter-Identifikator DeviceID angegeben |
|
| ERR_NOT_SUPPORTED | Das Protokoll wird vom Adapter nicht unterstützt |
|
| ERR_INVALID_PROTOCOL_ID v4.04 ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0 |
Es wurde eine nicht existierende ProtocolID angegeben |
|
| ERR_NULL_PARAMETER | Der Zeiger pChannelID wurde nicht angegeben |
|
| ERR_INVALID_FLAGS v4.04 ERR_FLAG_NOT_SUPPORTED v5.0 |
Es wurde ein nicht unterstütztes Flag angegeben |
|
| ERR_BAUDRATE_NOT_SUPPORTED | Es wurde eine nicht unterstützte Übertragungsgeschwindigkeit angegeben |
|
| ERR_CHANNEL_IN_USE | Der Kanal wird bereits verwendet |
Wichtig: In der Praxis tritt dieser Fehlercode niemals auf, da bei einem erneuten Aufruf von PassThruConnect automatisch PassThruDisconnect aufgerufen wird und der Kanal neu geöffnet wird.
|
| ERR_FAILED | Interner Fehler |
|
#include "j2534_dll.hpp"
// DeviceID wurde zuvor von PassThruOpen erhalten
unsigned long DeviceID;
unsigned long ChannelID;
unsigned long Flags = 0; // Hängt vom Protokoll ab
// Verbindung über CAN-Bus ISO 15765 mit einer Geschwindigkeit von 500 kBit/s
long ret = PassThruConnect(DeviceID, ISO15765, Flags, 500000, &ChannelID);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
// Fehlerbehandlung
}
// deviceID wurde zuvor von ptOpen erhalten
val protocolID = ISO15765
val flags = 0
val baudRate = 500000
val resConnect = j2534.ptConnect(deviceID, protocolID, flags, baudRate)
if (resConnect.status == STATUS_NOERROR) {
val channelID = resConnect.chnlId
// Kommunikationskanal mit dem Fahrzeug geöffnet
Log.i("J2534", "Kanal geöffnet, ChannelID: $channelID")
} else {
// Fehlerbehandlung
Log.e("J2534", "Fehler beim Öffnen des Kanals: ${resConnect.status}")
}
import ctypes
# Laden der Bibliothek
# Windows: j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")
# macOS: j2534 = ctypes.CDLL("libj2534_v04_04.dylib")
# Linux: j2534 = ctypes.CDLL("libj2534_v04_04.so")
ISO15765 = 6
STATUS_NOERROR = 0
# device_id wurde zuvor von PassThruOpen erhalten
device_id = ctypes.c_ulong(0)
channel_id = ctypes.c_ulong()
protocol_id = ISO15765
flags = 0
baud_rate = 500000
ret = j2534.PassThruConnect(device_id, protocol_id, flags, baud_rate, ctypes.byref(channel_id))
if ret == STATUS_NOERROR:
print(f"Kanal geöffnet, ChannelID: {channel_id.value}")
else:
error_msg = ctypes.create_string_buffer(256)
j2534.PassThruGetLastError(error_msg)
print(f"Fehler: {error_msg.value.decode()}")
using System;
using System.Runtime.InteropServices;
public class J2534Example
{
// Windows: j2534sd_v04_04_x64.dll
[DllImport("j2534sd_v04_04_x64.dll")]
public static extern int PassThruConnect(uint deviceId, uint protocolId,
uint flags, uint baudRate, out uint channelId);
[DllImport("j2534sd_v04_04_x64.dll")]
public static extern int PassThruGetLastError(byte[] errorMsg);
const uint ISO15765 = 6;
const int STATUS_NOERROR = 0;
public void ConnectExample(uint deviceId)
{
uint channelId;
uint flags = 0;
uint baudRate = 500000;
int ret = PassThruConnect(deviceId, ISO15765, flags, baudRate, out channelId);
if (ret == STATUS_NOERROR)
{
Console.WriteLine($"Kanal geöffnet, ChannelID: {channelId}");
}
else
{
byte[] errorMsg = new byte[256];
PassThruGetLastError(errorMsg);
Console.WriteLine($"Fehler: {System.Text.Encoding.ASCII.GetString(errorMsg)}");
}
}
}