Последнее изменение:
Перед началом приёма или передачи сообщений, необходимо установить фильтры сообщений. Если ни один фильтр не установлен, то все сообщения блокируются. Для протокола 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)
| Название константы | Описание |
|---|---|
| PASS_FILTER | Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение пропускается. Этот фильтр не действителен для ISO 15765 протоколов. |
| BLOCK_FILTER | Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение блокируется. Этот фильтр не действителен для ISO 15765 протоколов. |
| FLOW_CONTROL_FILTER | Если условия фильтра заданные параметрами фильтра удовлетворяются, то сообщение пропускается. Этот фильтр действителен только для ISO 15765 протоколов. |
| Определение | Описание |
|---|---|
| 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() |
#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)
{
// Обработка ошибки
}
// 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}")
}
#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)
{
// Обработка ошибки
}