Starten einer periodischen Nachricht
Letzte Änderung:
Startet das automatische periodische Senden einer Nachricht auf den Bus in einem festgelegten Intervall. Wird zur Aufrechterhaltung der Diagnosesitzung (Tester Present) oder zum periodischen Abfragen von Sensoren verwendet.
long PassThruStartPeriodicMsg(unsigned long ChannelID, PASSTHRU_MSG* pMsg, unsigned long* pMsgID, unsigned long TimeInterval)
PassThruConnect erhaltene Kanal-ID.PassThruStopPeriodicMsg benötigt.| Code | Beschreibung | Mögliche Ursachen und Lösungen |
|---|---|---|
| STATUS_NOERROR | Funktion erfolgreich ausgeführt | — |
| ERR_NULL_PARAMETER | Zeiger pMsg nicht gesetzt |
|
| ERR_INVALID_MSG | Ungültige Nachrichtenstruktur |
|
| ERR_INVALID_CHANNEL_ID | Ungültige Kanal-ID |
|
| ERR_DEVICE_NOT_CONNECTED | Keine Verbindung zum Adapter |
|
| ERR_INVALID_DEVICE_ID | Ungültige Geräte-ID |
|
| ERR_INVALID_TIME_INTERVAL | Unzulässiges Zeitintervall |
|
| ERR_NOT_SUPPORTED | Parameter werden vom Adapter nicht unterstützt |
|
| ERR_MSG_PROTOCOL_ID | Protokoll stimmt nicht überein |
|
| ERR_EXCEEDED_LIMIT | Limit für periodische Nachrichten überschritten |
|
| ERR_FAILED | Interner Fehler |
|
#include "j2534_lib.hpp"
unsigned long ChannelID; // Kanal-ID
unsigned long MsgID; // ID für die neue periodische Nachricht
long Ret;
PASSTHRU_MSG Msg;
// Nachricht "Tester Present" für ISO15765
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.DataSize = 5;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF; // Adresse des Steuergeräts
Msg.Data[4] = 0x3E; // Befehl Tester Present
// Senden alle 2000 ms starten
Ret = PassThruStartPeriodicMsg(ChannelID, &Msg, &MsgID, 2000);
if (Ret != STATUS_NOERROR)
{
// Fehlerbehandlung
}
// channelID wurde zuvor erhalten
val timeInterval = 2000 // ms
// Nachricht "Tester Present" für ISO15765
val msg = PassThruMsg(
protocolID = ISO15765,
dataSize = 5,
txFlags = ISO15765_FRAME_PAD,
data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x3E)
)
val result = j2534.ptStartPeriodicMsg(channelID, msg, timeInterval)
if (result.status == STATUS_NOERROR) {
val msgID = result.msgId
// Periodische Nachricht erfolgreich gestartet
Log.i("J2534", "Periodische Nachricht gestartet, MsgID: $msgID")
} else {
// Fehlerbehandlung
Log.e("J2534", "Fehler beim Starten der periodischen Nachricht: ${result.status}")
}
import ctypes
# Bibliothek laden
j2534 = ctypes.CDLL("libj2534_v04_04.so") # Linux
# j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll") # Windows
# channel_id wurde zuvor erhalten
time_interval = 2000 # ms
# Nachrichtenstruktur
class PASSTHRU_MSG(ctypes.Structure):
_fields_ = [
("ProtocolID", ctypes.c_ulong),
("RxStatus", ctypes.c_ulong),
("TxFlags", ctypes.c_ulong),
("Timestamp", ctypes.c_ulong),
("DataSize", ctypes.c_ulong),
("ExtraDataIndex", ctypes.c_ulong),
("Data", ctypes.c_ubyte * 4128)
]
msg = PASSTHRU_MSG()
msg.ProtocolID = 6 # ISO15765
msg.TxFlags = 0x40 # ISO15765_FRAME_PAD
msg.DataSize = 5
msg.Data[0:5] = [0x00, 0x00, 0x07, 0xDF, 0x3E] # Tester Present
msg_id = ctypes.c_ulong()
ret = j2534.PassThruStartPeriodicMsg(channel_id, ctypes.byref(msg), ctypes.byref(msg_id), time_interval)
if ret == 0: # STATUS_NOERROR
print(f"Periodische Nachricht gestartet, MsgID: {msg_id.value}")
using System;
using System.Runtime.InteropServices;
// channel_id wurde zuvor erhalten
uint timeInterval = 2000; // ms
var msg = new PASSTHRU_MSG
{
ProtocolID = 6, // ISO15765
TxFlags = 0x40, // ISO15765_FRAME_PAD
DataSize = 5,
Data = new byte[4128]
};
msg.Data[0] = 0x00;
msg.Data[1] = 0x00;
msg.Data[2] = 0x07;
msg.Data[3] = 0xDF;
msg.Data[4] = 0x3E; // Tester Present
uint msgId;
int ret = J2534.PassThruStartPeriodicMsg(channelId, ref msg, out msgId, timeInterval);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Periodische Nachricht gestartet, MsgID: {msgId}");
}