设置消息过滤器
最后修改:
在开始接收或发送消息之前,必须设置消息过滤器。如果未设置任何过滤器,则所有消息都会被阻止。对于 ISO 15765 协议,仅可使用一种过滤器类型 FLOW_CONTROL_FILTER。该过滤器不能 用于其他协议。每个 ChannelID 最多可创建 16 个 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 | 未与适配器建立连接 |
|
| ERR_INVALID_DEVICE_ID | 无效的设备标识符 |
|
| ERR_INVALID_CHANNEL_ID | 无效的通道标识符 |
|
| ERR_INVALID_MSG | 消息结构不正确 |
|
| ERR_NULL_PARAMETER | 传入了 NULL 而非必需的指针 |
|
| ERR_NOT_UNIQUE | CAN ID 已在另一个 FLOW_CONTROL_FILTER 中使用 |
|
| ERR_EXCEEDED_LIMIT | 超出过滤器数量上限 |
|
| ERR_MSG_PROTOCOL_ID | 协议不匹配 |
|
| ERR_FAILED | 未定义的错误 |
|
#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 的 ECU 的响应
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}")
}
from ctypes import *
# channelID 此前从 PassThruConnect 获取
# 创建消息结构
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"过滤器已设置,ID: {filter_id.value}")
else:
print(f"错误: {ret}")
// channelID 此前从 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($"过滤器已设置,ID: {filterId}");
}
#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)
{
// 错误处理
}