Ustawienie filtra wiadomości
Ostatnia modyfikacja:
Przed rozpoczęciem odbioru lub wysyłania wiadomości należy ustawić filtry wiadomości. Jeśli nie ustawiono żadnego filtra, wszystkie wiadomości są blokowane. Dla protokołu ISO 15765 dostępny jest tylko jeden typ filtra FLOW_CONTROL_FILTER. Nie można go ustawiać dla innych protokołów. Dla każdego ChannelID można utworzyć do 16 filtrów FLOW_CONTROL_FILTER oraz do 10 filtrów PASS_FILTER lub BLOCK_FILTER. Dla każdego wybranego typu filtra należy podać parametry filtra. Dla FLOW_CONTROL_FILTER podaje się trzy parametry pMaskMsg, pPatternMsg, pFlowControlMsg. Dla PASS_FILTER lub BLOCK_FILTER podaje się dwa parametry pMaskMsg i pPatternMsg. Długość parametrów może wynosić od 1 do 12 bajtów.
long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)
| Nazwa stałej | Opis |
|---|---|
| PASS_FILTER | Jeśli warunki filtra określone parametrami filtra są spełnione, wiadomość zostaje przepuszczona. Ten filtr nie jest ważny dla protokołów ISO 15765. |
| BLOCK_FILTER | Jeśli warunki filtra określone parametrami filtra są spełnione, wiadomość zostaje zablokowana. Ten filtr nie jest ważny dla protokołów ISO 15765. |
| FLOW_CONTROL_FILTER | Jeśli warunki filtra określone parametrami filtra są spełnione, wiadomość zostaje przepuszczona. Ten filtr jest ważny tylko dla protokołów ISO 15765. |
| Kod | Opis | Możliwe przyczyny i rozwiązania |
|---|---|---|
| STATUS_NOERROR | Funkcja wykonana pomyślnie | — |
| ERR_DEVICE_NOT_CONNECTED | Brak połączenia z adapterem |
|
| ERR_INVALID_DEVICE_ID | Nieprawidłowy identyfikator urządzenia |
|
| ERR_INVALID_CHANNEL_ID | Nieprawidłowy identyfikator kanału |
|
| ERR_INVALID_MSG | Nieprawidłowa struktura wiadomości |
|
| ERR_NULL_PARAMETER | Przekazano NULL zamiast wymaganego wskaźnika |
|
| ERR_NOT_UNIQUE | CAN ID jest już używany w innym FLOW_CONTROL_FILTER |
|
| ERR_EXCEEDED_LIMIT | Przekroczono limit filtrów |
|
| ERR_MSG_PROTOCOL_ID | Niezgodność protokołu |
|
| ERR_FAILED | Nieokreślony błąd |
|
#include "j2534_lib.hpp"
// ... ChannelID uzyskany z PassThruConnect ...
PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long FilterID;
long Ret;
// Maska: porównujemy pierwsze 4 bajty (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);
// Wzorzec: odbieramy wiadomości z CAN ID 0x7E8
PatternMsg.ProtocolID = ISO15765;
PatternMsg.DataSize = 4;
PatternMsg.Data[0] = 0x00;
PatternMsg.Data[1] = 0x00;
PatternMsg.Data[2] = 0x07;
PatternMsg.Data[3] = 0xE8;
// Odpowiedź FlowControl: wysyłamy na 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)
{
// Obsługa błędu
}
// channelID uzyskany wcześniej z ptConnect
val mask = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Maska dla CAN ID (porównujemy wszystkie 4 bajty)
data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Odbieramy odpowiedzi od ECU z CAN ID 0x7E8
data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
protocolID = ISO15765,
dataSize = 4,
txFlags = ISO15765_FRAME_PAD,
// Wysyłamy FlowControl na 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
// Filtr ustawiony pomyślnie
Log.i("J2534", "Filtr FLOW_CONTROL_FILTER ustawiony, ID: $filterID")
} else {
// Obsługa błędu
Log.e("J2534", "Błąd ustawiania filtra: ${resFilter.status}")
}
from ctypes import *
# channelID uzyskany wcześniej z PassThruConnect
# Tworzymy struktury wiadomości
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"Filtr ustawiony, ID: {filter_id.value}")
else:
print(f"Błąd: {ret}")
// channelID uzyskany wcześniej z PassThruConnect
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($"Filtr ustawiony, ID: {filterId}");
}
#include "j2534_lib.hpp"
// ... ChannelID uzyskany z PassThruConnect ...
PASSTHRU_MSG MaskMsg, PatternMsg;
unsigned long FilterID;
long Ret;
// Maska: porównujemy pierwszy bajt (format)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;
// Wzorzec: przepuszczamy wszystkie wiadomości z bitem formatu = 1
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;
Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
// Obsługa błędu
}