Quantex GmbH
您的地区:欧洲

PassThruStartPeriodicMsg v4.04 v5.0

启动周期性消息

最后修改:

说明

以指定的间隔启动向总线自动周期性发送消息。用于保持诊断会话(Tester Present)或周期性轮询传感器。

long PassThruStartPeriodicMsg(unsigned long ChannelID, PASSTHRU_MSG* pMsg, unsigned long* pMsgID, unsigned long TimeInterval)

参数

返回的错误代码

代码 说明 可能的原因与解决方法
STATUS_NOERROR 函数执行成功
ERR_NULL_PARAMETER 未指定 pMsg 指针
  • 传入了 nullptr 而不是消息指针
  • 解决方法:传入指向 PASSTHRU_MSG 结构体的有效指针
ERR_INVALID_MSG 消息结构体无效
  • 数据长度为 0 或超过 12 字节
  • 解决方法:确保 DataSize 在 1–12 范围内
ERR_INVALID_CHANNEL_ID 通道标识符无效
  • 通道未打开或已关闭
  • 解决方法:使用由 PassThruConnect 获取的 ChannelID
ERR_DEVICE_NOT_CONNECTED 未与适配器建立连接
  • 适配器已关闭、网络断开、IP 地址错误
  • 解决方法:检查适配器的供电和网络连接
ERR_INVALID_DEVICE_ID 设备标识符无效
  • DeviceID 未通过 PassThruOpen 获取或设备已关闭
  • 解决方法:使用由 PassThruOpen 获取的 DeviceID
ERR_INVALID_TIME_INTERVAL 时间间隔无效
  • TimeInterval 的值超出 5–65535 毫秒范围
  • 解决方法:使用允许范围内的间隔
ERR_NOT_SUPPORTED 适配器不支持该参数
  • 固件不支持小于 20 毫秒的间隔
  • 解决方法:将 TimeInterval 增大到 20 毫秒及以上
ERR_MSG_PROTOCOL_ID 协议不匹配
  • 消息中的 ProtocolID 与通道协议不一致
  • 解决方法:将 pMsg->ProtocolID 设置为与 PassThruConnect 中指定的相同协议
ERR_EXCEEDED_LIMIT 超出周期性消息数量上限
  • 适配器支持的周期性消息数量有限(通常为 10 条)
  • 解决方法:通过 PassThruStopPeriodicMsg 停止未使用的周期性消息
ERR_FAILED 内部错误
  • DLL 或适配器固件中出现错误
  • 解决方法:调用 PassThruGetLastError() 获取详细信息

示例

C/C++ 示例

#include "j2534_lib.hpp"

unsigned long ChannelID; // 通道 ID
unsigned long MsgID;     // 新周期性消息的 ID
long Ret;
PASSTHRU_MSG Msg;

// 用于 ISO15765 的 "Tester Present" 消息
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.DataSize = 5;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF; // ECU 地址
Msg.Data[4] = 0x3E; // Tester Present 命令

// 启动每 2000 毫秒发送一次
Ret = PassThruStartPeriodicMsg(ChannelID, &Msg, &MsgID, 2000);
if (Ret != STATUS_NOERROR)
{
    // 错误处理
}

Kotlin (Android) 示例

// channelID 已在之前获取
val timeInterval = 2000 // ms

// 用于 ISO15765 的 "Tester Present" 消息
val msg = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 5,
    txFlags = ISO15765_FRAME_PAD,
    data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x3E)
)

val result = j2534.ptStartPeriodicMsg(channelID, msg, timeInterval)
if (result.status == STATUS_NOERROR) {
    val msgID = result.msgId
    // 周期性消息已成功启动
    Log.i("J2534", "周期性消息已启动,MsgID: $msgID")
} else {
    // 错误处理
    Log.e("J2534", "启动周期性消息出错: ${result.status}")
}

Python 示例

import ctypes

# 加载库
j2534 = ctypes.CDLL("libj2534_v04_04.so")  # Linux
# j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")  # Windows

# channel_id 已在之前获取
time_interval = 2000  # 毫秒

# 消息结构体
class PASSTHRU_MSG(ctypes.Structure):
    _fields_ = [
        ("ProtocolID", ctypes.c_ulong),
        ("RxStatus", ctypes.c_ulong),
        ("TxFlags", ctypes.c_ulong),
        ("Timestamp", ctypes.c_ulong),
        ("DataSize", ctypes.c_ulong),
        ("ExtraDataIndex", ctypes.c_ulong),
        ("Data", ctypes.c_ubyte * 4128)
    ]

msg = PASSTHRU_MSG()
msg.ProtocolID = 6  # ISO15765
msg.TxFlags = 0x40  # ISO15765_FRAME_PAD
msg.DataSize = 5
msg.Data[0:5] = [0x00, 0x00, 0x07, 0xDF, 0x3E]  # Tester Present

msg_id = ctypes.c_ulong()
ret = j2534.PassThruStartPeriodicMsg(channel_id, ctypes.byref(msg), ctypes.byref(msg_id), time_interval)
if ret == 0:  # STATUS_NOERROR
    print(f"周期性消息已启动,MsgID: {msg_id.value}")

C# 示例

using System;
using System.Runtime.InteropServices;

// channel_id 已在之前获取
uint timeInterval = 2000; // 毫秒

var msg = new PASSTHRU_MSG
{
    ProtocolID = 6, // ISO15765
    TxFlags = 0x40, // ISO15765_FRAME_PAD
    DataSize = 5,
    Data = new byte[4128]
};
msg.Data[0] = 0x00;
msg.Data[1] = 0x00;
msg.Data[2] = 0x07;
msg.Data[3] = 0xDF;
msg.Data[4] = 0x3E; // Tester Present

uint msgId;
int ret = J2534.PassThruStartPeriodicMsg(channelId, ref msg, out msgId, timeInterval);
if (ret == 0) // STATUS_NOERROR
{
    Console.WriteLine($"周期性消息已启动,MsgID: {msgId}");
}