Quantex GmbH
Tu región: Europa

PassThruStartPeriodicMsg v4.04 v5.0

Inicio de un mensaje periódico

Última modificación:

Descripción

Inicia el envío automático periódico de un mensaje al bus con un intervalo definido. Se utiliza para mantener la sesión de diagnóstico (Tester Present) o para el sondeo periódico de sensores.

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

Parámetros

Códigos de error devueltos

Código Descripción Posibles causas y soluciones
STATUS_NOERROR La función se ejecutó correctamente
ERR_NULL_PARAMETER No se indicó el puntero pMsg
  • Se pasó nullptr en lugar de un puntero al mensaje
  • Solución: pase un puntero válido a la estructura PASSTHRU_MSG
ERR_INVALID_MSG Estructura de mensaje no válida
  • El tamaño de datos es 0 o supera los 12 bytes
  • Solución: asegúrese de que DataSize esté en el rango 1–12
ERR_INVALID_CHANNEL_ID Identificador de canal no válido
  • El canal no se abrió o ya se cerró
  • Solución: use el ChannelID obtenido de PassThruConnect
ERR_DEVICE_NOT_CONNECTED Sin conexión con el adaptador
  • Adaptador apagado, red perdida, dirección IP incorrecta
  • Solución: compruebe la alimentación del adaptador y la conexión de red
ERR_INVALID_DEVICE_ID Identificador de dispositivo no válido
  • El DeviceID no se obtuvo mediante PassThruOpen o el dispositivo está cerrado
  • Solución: use el DeviceID obtenido de PassThruOpen
ERR_INVALID_TIME_INTERVAL Intervalo de tiempo no admisible
  • El valor de TimeInterval está fuera del rango 5–65535 ms
  • Solución: use un intervalo dentro del rango admisible
ERR_NOT_SUPPORTED Parámetros no admitidos por el adaptador
  • Un intervalo inferior a 20 ms no es compatible con el firmware
  • Solución: aumente TimeInterval a 20 ms o más
ERR_MSG_PROTOCOL_ID Discrepancia de protocolo
  • El ProtocolID del mensaje no coincide con el protocolo del canal
  • Solución: establezca en pMsg->ProtocolID el mismo protocolo indicado en PassThruConnect
ERR_EXCEEDED_LIMIT Se superó el límite de mensajes periódicos
  • El adaptador admite un número limitado de mensajes periódicos (normalmente 10)
  • Solución: detenga los mensajes periódicos no utilizados mediante PassThruStopPeriodicMsg
ERR_FAILED Error interno
  • Error en la DLL o en el firmware del adaptador
  • Solución: llame a PassThruGetLastError() para obtener los detalles

Ejemplos

Ejemplo en C/C++

#include "j2534_lib.hpp"

unsigned long ChannelID; // ID del canal
unsigned long MsgID;     // ID para el nuevo mensaje periódico
long Ret;
PASSTHRU_MSG Msg;

// Mensaje "Tester Present" para ISO15765
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; // Dirección de la ECU
Msg.Data[4] = 0x3E; // Comando Tester Present

// Iniciamos el envío cada 2000 ms
Ret = PassThruStartPeriodicMsg(ChannelID, &Msg, &MsgID, 2000);
if (Ret != STATUS_NOERROR)
{
    // Manejo del error
}

Ejemplo en Kotlin (Android)

// channelID obtenido previamente
val timeInterval = 2000 // ms

// Mensaje "Tester Present" para ISO15765
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
    // Mensaje periódico iniciado correctamente
    Log.i("J2534", "Mensaje periódico iniciado, MsgID: $msgID")
} else {
    // Manejo del error
    Log.e("J2534", "Error al iniciar el mensaje periódico: ${result.status}")
}

Ejemplo en Python

import ctypes

# Carga de la biblioteca
j2534 = ctypes.CDLL("libj2534_v04_04.so")  # Linux
# j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")  # Windows

# channel_id obtenido previamente
time_interval = 2000  # ms

# Estructura del mensaje
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"Mensaje periódico iniciado, MsgID: {msg_id.value}")

Ejemplo en C#

using System;
using System.Runtime.InteropServices;

// channel_id obtenido previamente
uint timeInterval = 2000; // ms

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($"Mensaje periódico iniciado, MsgID: {msgId}");
}