Senden von Nachrichten
Letzte Änderung:
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)
PassThruStartMsgFilter ein Flow-Control-Filter eingerichtet werden. Ohne diesen gibt die Funktion den Fehler ERR_NO_FLOW_CONTROL zurück.
PassThruConnect zurückgegeben wurde.ERR_TIMEOUT zurückgegeben. Ist der Timeout gleich
0, werden die Nachrichten ohne Warten auf die physische Übertragung in die Sendewarteschlange gestellt, und die Funktion kehrt sofort zurück. In diesem Fall wird der Fehler ERR_TIMEOUT nicht erzeugt.| Code | Beschreibung | Mögliche Ursachen und Lösungen |
|---|---|---|
| STATUS_NOERROR | Funktion erfolgreich ausgeführt | — |
| ERR_DEVICE_NOT_CONNECTED | Keine Verbindung zum Adapter |
|
| ERR_INVALID_CHANNEL_ID | Es wurde eine nicht existierende Kanalkennung ChannelID angegeben |
|
| ERR_NULL_PARAMETER | Zeiger pMsg oder pNumMsgs nicht angegeben |
|
| ERR_TIMEOUT | Innerhalb der vorgegebenen Zeit konnten nicht alle Nachrichten gesendet werden |
|
| ERR_INVALID_MSG | Ungültige Nachrichtenstruktur in pMsg |
|
| ERR_MSG_PROTOCOL_ID | Das Protokoll in der Nachricht stimmt nicht mit dem Protokoll des Kanals überein |
|
| ERR_NO_FLOW_CONTROL | Für das Protokoll ISO 15765 ist kein Flow-Control-Filter eingerichtet |
|
| ERR_BUFFER_FULL | Sendewarteschlange übergelaufen |
|
| ERR_FAILED | Interner Fehler in der Bibliothek oder im Adapter |
|
#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
}
// 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}")
}
# 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}")
// 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}");
}