Quantex GmbH
您的地区:欧洲

PassThruWriteMsgs v4.04

发送消息

最后修改:

说明

该函数通过诊断协议发送消息。适配器的发送队列每个通道的单个队列可容纳 50 条消息,所有队列共有 64 KB 的可用内存。当队列已满或全部可用内存耗尽时,发送队列将暂停接收消息。

long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
重要:对于 ISO 15765 协议,在发送消息之前必须使用 PassThruStartMsgFilter 设置 Flow Control 过滤器。否则函数将返回错误 ERR_NO_FLOW_CONTROL

参数

返回的错误码

代码 说明 可能的原因与解决方法
STATUS_NOERROR 函数执行成功
ERR_DEVICE_NOT_CONNECTED 未与适配器建立连接
  • 适配器已关闭或连接丢失
  • 解决方法:检查适配器供电以及网络/BLE 连接
  • IP 地址设置不正确
  • 解决方法:检查 PassThruOpen 中的连接参数
ERR_INVALID_CHANNEL_ID 指定了不存在的通道标识符 ChannelID
  • ChannelID 不是由 PassThruConnect 获得的
  • 解决方法:使用由 PassThruConnect 函数返回的 ChannelID
  • 通道已通过 PassThruDisconnect 关闭
  • 解决方法:通过 PassThruConnect 重新打开通道
ERR_NULL_PARAMETER 未指定指针 pMsg 或 pNumMsgs
  • 传入了 NULL 而不是指针
  • 解决方法:传入指向消息数组和数量变量的有效指针
ERR_TIMEOUT 在规定时间内未能发送全部消息
  • 消息过多或超时过短
  • 解决方法:增大 Timeout 值或减少消息数量
  • 总线存在问题(无 CAN 确认)
  • 解决方法:检查与车辆的连接以及总线状态
ERR_INVALID_MSG pMsg 中的消息结构不正确
  • 消息数据或大小不正确
  • 解决方法:检查 PASSTHRU_MSG 结构中的 DataSize、Data 和 TxFlags 字段
ERR_MSG_PROTOCOL_ID 消息中的协议与通道协议不一致
  • 消息结构中的 ProtocolID 与 PassThruConnect 中指定的不同
  • 解决方法:在 pMsg->ProtocolID 中设置与打开通道时所用相同的协议
ERR_NO_FLOW_CONTROL 对于 ISO 15765 协议未设置 Flow Control 过滤器
  • 尝试在未配置过滤器的情况下发送 ISO 15765 消息
  • 解决方法:在发送前以 FLOW_CONTROL_FILTER 类型调用 PassThruStartMsgFilter
ERR_BUFFER_FULL 发送队列已满
  • 队列中消息过多(上限:50 条消息,64 KB)
  • 解决方法:等待先前的消息发送完成,或通过 PassThruIoctl(CLEAR_TX_BUFFER) 清空队列
ERR_FAILED 库或适配器内部错误
  • 内存分配错误或堆栈故障
  • 解决方法:调用 PassThruGetLastError() 获取详细信息

示例

C/C++ 示例

#include "j2534_dll.hpp"

// ChannelID 此前已通过 PassThruConnect 获得
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;

// 构建 ISO 15765 消息(请求 SID 0x22, PID 0xF190)
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF;
Msg.Data[4] = 0x22;
Msg.Data[5] = 0xF1;
Msg.Data[6] = 0x90;
Msg.DataSize = 7;

long ret = PassThruWriteMsg(ChannelID, &Msg, &NumMsgs, Timeout);
if (ret != STATUS_NOERROR) {
    char error[256];
    PassThruGetLastError(error);
    // 错误处理
}

Kotlin (Android) 示例

// channelID 此前已通过 ptConnect 获得
val msg = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 7,
    txFlags = ISO15765_FRAME_PAD,
    // 请求 VIN(SID 0x22, PID 0xF190)
    data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x22, 0xF1.toByte(), 0x90.toByte())
)

val messages = arrayOf(msg)
val timeout = 200 // ms

val result = j2534.ptWriteMsgs(channelID, messages, timeout)
if (result.status == STATUS_NOERROR) {
    Log.i("J2534", "已发送消息数: ${result.numMsgs}")
} else {
    Log.e("J2534", "发送错误: ${result.status}")
}

Python 示例

# channel_id 此前已通过 PassThruConnect 获得
msg = PassThruMsg()
msg.ProtocolID = ISO15765
msg.TxFlags = ISO15765_FRAME_PAD
msg.Data = bytes([0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90])
msg.DataSize = 7

num_msgs = ctypes.c_ulong(1)
timeout = 200  # ms

ret = j2534.PassThruWriteMsg(channel_id, ctypes.byref(msg), ctypes.byref(num_msgs), timeout)
if ret == 0:  # STATUS_NOERROR
    print(f"已发送消息数: {num_msgs.value}")
else:
    print(f"发送错误: {ret}")

C# 示例

// channelId 此前已通过 PassThruConnect 获得
var msg = new PassThruMsg {
    ProtocolID = ISO15765,
    TxFlags = ISO15765_FRAME_PAD,
    Data = new byte[] { 0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90 },
    DataSize = 7
};

uint numMsgs = 1;
uint timeout = 200; // ms

int ret = J2534.PassThruWriteMsg(channelId, ref msg, ref numMsgs, timeout);
if (ret == 0) {
    Console.WriteLine($"已发送消息数: {numMsgs}");
} else {
    Console.WriteLine($"发送错误: {ret}");
}