Quantex GmbH
Votre région : Europe

PassThruStartPeriodicMsg v4.04 v5.0

Démarrage d'un message périodique

Dernière modification :

Description

Démarre l'envoi automatique périodique d'un message sur le bus à un intervalle défini. Utilisé pour maintenir la session de diagnostic (Tester Present) ou pour l'interrogation périodique des capteurs.

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

Paramètres

Codes d'erreur renvoyés

Code Description Causes possibles et solutions
STATUS_NOERROR La fonction s'est exécutée correctement
ERR_NULL_PARAMETER Le pointeur pMsg n'a pas été indiqué
  • Un nullptr a été passé au lieu d'un pointeur vers le message
  • Solution : passez un pointeur valide vers la structure PASSTHRU_MSG
ERR_INVALID_MSG Structure de message non valide
  • La taille des données est 0 ou dépasse 12 octets
  • Solution : assurez-vous que DataSize est dans la plage 1–12
ERR_INVALID_CHANNEL_ID Identifiant de canal non valide
  • Le canal n'a pas été ouvert ou a déjà été fermé
  • Solution : utilisez le ChannelID obtenu de PassThruConnect
ERR_DEVICE_NOT_CONNECTED Aucune connexion avec l'adaptateur
  • Adaptateur éteint, réseau perdu, adresse IP incorrecte
  • Solution : vérifiez l'alimentation de l'adaptateur et la connexion réseau
ERR_INVALID_DEVICE_ID Identifiant de périphérique non valide
  • Le DeviceID n'a pas été obtenu via PassThruOpen ou le périphérique est fermé
  • Solution : utilisez le DeviceID obtenu de PassThruOpen
ERR_INVALID_TIME_INTERVAL Intervalle de temps non admissible
  • La valeur de TimeInterval est hors de la plage 5–65535 ms
  • Solution : utilisez un intervalle dans la plage admissible
ERR_NOT_SUPPORTED Paramètres non pris en charge par l'adaptateur
  • Un intervalle inférieur à 20 ms n'est pas pris en charge par le firmware
  • Solution : augmentez TimeInterval à 20 ms ou plus
ERR_MSG_PROTOCOL_ID Incohérence de protocole
  • Le ProtocolID du message ne correspond pas au protocole du canal
  • Solution : définissez dans pMsg->ProtocolID le même protocole que celui indiqué lors de PassThruConnect
ERR_EXCEEDED_LIMIT Limite de messages périodiques dépassée
  • L'adaptateur prend en charge un nombre limité de messages périodiques (généralement 10)
  • Solution : arrêtez les messages périodiques inutilisés via PassThruStopPeriodicMsg
ERR_FAILED Erreur interne
  • Erreur dans la DLL ou le firmware de l'adaptateur
  • Solution : appelez PassThruGetLastError() pour obtenir les détails

Exemples

Exemple en C/C++

#include "j2534_lib.hpp"

unsigned long ChannelID; // ID du canal
unsigned long MsgID;     // ID pour le nouveau message périodique
long Ret;
PASSTHRU_MSG Msg;

// Message "Tester Present" pour 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; // Adresse de l'ECU
Msg.Data[4] = 0x3E; // Commande Tester Present

// On lance l'envoi toutes les 2000 ms
Ret = PassThruStartPeriodicMsg(ChannelID, &Msg, &MsgID, 2000);
if (Ret != STATUS_NOERROR)
{
    // Gestion de l'erreur
}

Exemple en Kotlin (Android)

// channelID obtenu précédemment
val timeInterval = 2000 // ms

// Message "Tester Present" pour 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
    // Message périodique démarré avec succès
    Log.i("J2534", "Message périodique démarré, MsgID: $msgID")
} else {
    // Gestion de l'erreur
    Log.e("J2534", "Erreur au démarrage du message périodique: ${result.status}")
}

Exemple en Python

import ctypes

# Chargement de la bibliothèque
j2534 = ctypes.CDLL("libj2534_v04_04.so")  # Linux
# j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")  # Windows

# channel_id obtenu précédemment
time_interval = 2000  # ms

# Structure du message
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"Message périodique démarré, MsgID: {msg_id.value}")

Exemple en C#

using System;
using System.Runtime.InteropServices;

// channel_id obtenu précédemment
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($"Message périodique démarré, MsgID: {msgId}");
}