Nachrichtenfilter einrichten
Letzte Änderung:
Bevor mit dem Empfang oder dem Senden von Nachrichten begonnen wird, müssen Nachrichtenfilter eingerichtet werden. Ist kein Filter eingerichtet, werden alle Nachrichten blockiert. Für das Protokoll ISO 15765 steht nur ein Filtertyp zur Verfügung: FLOW_CONTROL_FILTER. Er darf nicht für andere Protokolle eingerichtet werden. Für jede ChannelID können bis zu 16 Filter FLOW_CONTROL_FILTER sowie bis zu 10 PASS_FILTER oder BLOCK_FILTER angelegt werden. Für jeden gewählten Filtertyp müssen die Filterparameter angegeben werden. Für FLOW_CONTROL_FILTER werden drei Parameter angegeben: pMaskMsg, pPatternMsg, pFlowControlMsg. Für PASS_FILTER oder BLOCK_FILTER werden zwei Parameter angegeben: pMaskMsg und pPatternMsg. Die Länge der Parameter kann zwischen 1 und 12 Byte betragen.
long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)
| Konstantenname | Beschreibung |
|---|---|
| PASS_FILTER | Sind die durch die Filterparameter festgelegten Filterbedingungen erfüllt, wird die Nachricht durchgelassen. Dieser Filter ist für ISO-15765-Protokolle nicht gültig. |
| BLOCK_FILTER | Sind die durch die Filterparameter festgelegten Filterbedingungen erfüllt, wird die Nachricht blockiert. Dieser Filter ist für ISO-15765-Protokolle nicht gültig. |
| FLOW_CONTROL_FILTER | Sind die durch die Filterparameter festgelegten Filterbedingungen erfüllt, wird die Nachricht durchgelassen. Dieser Filter ist ausschließlich für ISO-15765-Protokolle gültig. |
| 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 | Ungültige Gerätekennung |
|
| ERR_INVALID_CHANNEL_ID | Ungültige Kanalkennung |
|
| ERR_INVALID_MSG | Fehlerhafte Nachrichtenstruktur |
|
| ERR_NULL_PARAMETER | NULL anstelle eines erforderlichen Zeigers übergeben |
|
| ERR_NOT_UNIQUE | Die CAN ID wird bereits in einem anderen FLOW_CONTROL_FILTER verwendet |
|
| ERR_EXCEEDED_LIMIT | Filterlimit überschritten |
|
| ERR_MSG_PROTOCOL_ID | Protokoll-Diskrepanz |
|
| ERR_FAILED | Nicht näher bestimmter Fehler |
|
#include "j2534_lib.hpp"
// ... ChannelID von PassThruConnect erhalten ...
PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long FilterID;
long Ret;
// Maske: Wir vergleichen die ersten 4 Byte (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);
// Muster: Wir nehmen Nachrichten mit CAN ID 0x7E8 an
PatternMsg.ProtocolID = ISO15765;
PatternMsg.DataSize = 4;
PatternMsg.Data[0] = 0x00;
PatternMsg.Data[1] = 0x00;
PatternMsg.Data[2] = 0x07;
PatternMsg.Data[3] = 0xE8;
// FlowControl-Antwort: Wir senden an CAN ID 0x7E0
FlowControlMsg.ProtocolID = ISO15765;
FlowControlMsg.DataSize = 4;
FlowControlMsg.Data[0] = 0x00;
FlowControlMsg.Data[1] = 0x00;
FlowControlMsg.Data[2] = 0x07;
FlowControlMsg.Data[3] = 0xE0;
Ret = PassThruStartMsgFilter(ChannelID, FLOW_CONTROL_FILTER,
&MaskMsg, &PatternMsg, &FlowControlMsg, &FilterID);
if (Ret != STATUS_NOERROR)
{
// Fehlerbehandlung
}
// channelID zuvor von ptConnect erhalten
val mask = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Maske für CAN ID (wir vergleichen alle 4 Byte)
data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Wir nehmen Antworten vom Steuergerät mit CAN ID 0x7E8 an
data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Wir senden FlowControl an CAN ID 0x7E0
data = byteArrayOf(0x00, 0x00, 0x07, 0xE0.toByte())
)
val resFilter = j2534.ptStartMsgFilter(channelID, FLOW_CONTROL_FILTER, mask, pattern, flowControl)
if (resFilter.status == STATUS_NOERROR) {
val filterID = resFilter.filterId
// Filter erfolgreich eingerichtet
Log.i("J2534", "Filter FLOW_CONTROL_FILTER eingerichtet, ID: $filterID")
} else {
// Fehlerbehandlung
Log.e("J2534", "Fehler beim Einrichten des Filters: ${resFilter.status}")
}
from ctypes import *
# channelID zuvor von PassThruConnect erhalten
# Wir erstellen die Nachrichtenstrukturen
mask = PASSTHRU_MSG()
mask.ProtocolID = ISO15765
mask.DataSize = 4
mask.Data[0:4] = [0xFF, 0xFF, 0xFF, 0xFF]
pattern = PASSTHRU_MSG()
pattern.ProtocolID = ISO15765
pattern.DataSize = 4
pattern.Data[0:4] = [0x00, 0x00, 0x07, 0xE8]
flow_control = PASSTHRU_MSG()
flow_control.ProtocolID = ISO15765
flow_control.DataSize = 4
flow_control.Data[0:4] = [0x00, 0x00, 0x07, 0xE0]
filter_id = c_ulong()
ret = j2534.PassThruStartMsgFilter(
channel_id, FLOW_CONTROL_FILTER,
byref(mask), byref(pattern), byref(flow_control), byref(filter_id)
)
if ret == 0: # STATUS_NOERROR
print(f"Filter eingerichtet, ID: {filter_id.value}")
else:
print(f"Fehler: {ret}")
// channelID zuvor von PassThruConnect erhalten
var mask = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }
};
var pattern = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0x00, 0x00, 0x07, 0xE8 }
};
var flowControl = new PASSTHRU_MSG {
ProtocolID = ISO15765,
DataSize = 4,
Data = new byte[] { 0x00, 0x00, 0x07, 0xE0 }
};
uint filterId;
int ret = J2534.PassThruStartMsgFilter(
channelId, FLOW_CONTROL_FILTER,
ref mask, ref pattern, ref flowControl, out filterId
);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Filter eingerichtet, ID: {filterId}");
}
#include "j2534_lib.hpp"
// ... ChannelID von PassThruConnect erhalten ...
PASSTHRU_MSG MaskMsg, PatternMsg;
unsigned long FilterID;
long Ret;
// Maske: Wir vergleichen das erste Byte (Format)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;
// Muster: Wir lassen alle Nachrichten mit gesetztem Format-Bit = 1 durch
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;
Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
// Fehlerbehandlung
}