Quantex GmbH
DE RU EN EL
Ваш регион: Европа

PassThru StartMsgFilter Установка фильтра сообщений

Последнее изменение:

Описание

Перед началом приёма или передачи сообщений, необходимо установить фильтры сообщений. Если ни один фильтр не установлен, то все сообщения блокируются. Для протокола ISO 15765 доступен только один тип фильтра FLOW_CONTROL_FILTER. Его нельзя устанавливать для других протоколов. Для каждого СhannelID можно создать до 64 фильтров FLOW_CONTROL_FILTER и до 10 PASS_FILTER или BLOCK_FILTER. Для каждого выбранного типа фильтра необходимо указать параметры фильтра. Для FLOW_CONTROL_FILTER указывается три параметра pMaskMsg, pPatternMsg, pFlowControlMsg. Для PASS_FILTER или BLOCK_FILTER указывается два параметра pMaskMsg и pPatternMsg. Длина параметров может быть от 1 до 12 байт.

long PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *FilterID)

Параметры

В протоколе ISO 15765 существует стандартное и расширенное сообщение. В стандартном сообщении для заголовка используется 4 байта для расширенного 5 байт. Расширенный заголовок используется например в BCM Toyota или в ЭБУ BMW.

Возвращаемые коды ошибок

Определение Описание
STATUS_NOERROR Функция выполнена успешно
ERR_DEVICE_NOT_CONNECTED Нет соединения с адаптером. Возможные причины: Адаптер выключен, нет сети, или не правильно задан IP адрес.
ERR_INVALID_DEVICE_ID Задан не существующий идентификатор адаптера DeviceID
ERR_INVALID_MSG Не правильная структура сообщения заданная в указателях pMaskMsg, pPatternMsg или pFlowControlMsg
ERR_INVALID_CHANNEL_ID Задан не существующий идентификатор канала ChannelID
ERR_NULL_PARAMETER Не задан указатель на pMaskMsg или pPatternMsg
ERR_NOT_UNIQUE CAN ID в pPatternMsg или pFlowControlMsg соответствует какому либо ID в уже существующем FLOW_CONTROL_FILTER
ERR_MSG_PROTOCOL_ID Протокол заданный в параметрах фильтра не совпадает с протоколом заданным в ChannelID
ERR_EXCEEDED_LIMIT Превышено количество установленных фильтров.
ERR_FAILED Внутренняя ошибка в dll или в микропрограммы адаптере. Такие как ошибка выделения памяти или сбой стека. Для получения поробностей нужно использовать функцию PassThruGetLastError()

Примеры

Протокол ISO15765 (CAN)

Пример на C/C++

#include "j2534_lib.hpp"

// ... ChannelID получен от PassThruConnect ...

PASSTHRU_MSG MaskMsg, PatternMsg, FlowControlMsg;
unsigned long FilterID;
long Ret;

// Маска: сравниваем первые 4 байта (CAN ID)
MaskMsg.ProtocolID = ISO15765;
MaskMsg.DataSize = 4;
memset(MaskMsg.Data, 0xFF, 4);

// Шаблон: принимаем сообщения с 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;

// Ответ FlowControl: отправляем на 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)
{
    // Обработка ошибки
}

Пример на Kotlin (Android)

// channelID получен ранее от ptConnect
val mask = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Маска для CAN ID (сравниваем все 4 байта)
    data = byteArrayOf(0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0xFF.toByte())
)
val pattern = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Принимаем ответы от ЭБУ с CAN ID 0x7E8
    data = byteArrayOf(0x00, 0x00, 0x07, 0xE8.toByte())
)
val flowControl = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 4,
    txFlags = ISO15765_FRAME_PAD,
    // Отправляем FlowControl на 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
    // Фильтр успешно установлен
    Log.i("J2534", "Фильтр FLOW_CONTROL_FILTER установлен, ID: $filterID")
} else {
    // Обработка ошибки
    Log.e("J2534", "Ошибка установки фильтра: ${resFilter.status}")
}

Протокол ISO14230 (K-Line)

Пример на C/C++

#include "j2534_lib.hpp"

// ... ChannelID получен от PassThruConnect ...

PASSTHRU_MSG MaskMsg, PatternMsg;
unsigned long FilterID;
long Ret;

// Маска: сравниваем первый байт (формат)
MaskMsg.ProtocolID = ISO14230;
MaskMsg.DataSize = 1;
MaskMsg.Data[0] = 0x80;

// Шаблон: пропускаем все сообщения с битом формата = 1
PatternMsg.ProtocolID = ISO14230;
PatternMsg.DataSize = 1;
PatternMsg.Data[0] = 0x80;

Ret = PassThruStartMsgFilter(ChannelID, PASS_FILTER, &MaskMsg, &PatternMsg, NULL, &FilterID);
if (Ret != STATUS_NOERROR)
{
    // Обработка ошибки
}