Quantex GmbH
Votre région : Europe

PassThruWriteMsgs v4.04

Transmission de messages

Dernière modification :

Description

La fonction transmet des messages via le protocole de diagnostic. La file d'attente de transmission de l'adaptateur est dimensionnée pour 50 messages par file pour un canal et dispose de 64 Ko de mémoire libre pour toutes les files. Lorsque la file ou toute la mémoire libre est remplie, la réception de messages dans la file de transmission est suspendue.

long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
Important : Pour le protocole ISO 15765, avant de transmettre des messages, il est nécessaire d'établir le filtre Flow Control à l'aide de PassThruStartMsgFilter. Sans lui, la fonction renverra l'erreur ERR_NO_FLOW_CONTROL.

Paramètres

Codes d'erreur renvoyés

Code Description Causes possibles et solutions
STATUS_NOERROR La fonction s'est exécutée correctement
ERR_DEVICE_NOT_CONNECTED Aucune connexion avec l'adaptateur
  • L'adaptateur est éteint ou la connexion a été perdue
  • Solution : Vérifiez l'alimentation de l'adaptateur et la connexion réseau/BLE
  • Adresse IP indiquée de manière incorrecte
  • Solution : Vérifiez les paramètres de connexion dans PassThruOpen
ERR_INVALID_CHANNEL_ID Un identifiant de canal ChannelID inexistant a été indiqué
  • Le ChannelID n'a pas été obtenu de PassThruConnect
  • Solution : Utilisez le ChannelID renvoyé par la fonction PassThruConnect
  • Le canal a été fermé via PassThruDisconnect
  • Solution : Rouvrez le canal via PassThruConnect
ERR_NULL_PARAMETER Le pointeur pMsg ou pNumMsgs n'est pas indiqué
  • NULL a été passé à la place d'un pointeur
  • Solution : Passez un pointeur valide vers le tableau de messages et vers la variable de quantité
ERR_TIMEOUT Tous les messages n'ont pas pu être transmis dans le délai imparti
  • Trop de messages ou délai d'attente trop court
  • Solution : Augmentez la valeur de Timeout ou réduisez le nombre de messages
  • Problèmes sur le bus (pas de confirmation CAN)
  • Solution : Vérifiez la connexion au véhicule et l'état du bus
ERR_INVALID_MSG Structure de message incorrecte dans pMsg
  • Données ou taille du message incorrectes
  • Solution : Vérifiez les champs DataSize, Data et TxFlags dans la structure PASSTHRU_MSG
ERR_MSG_PROTOCOL_ID Le protocole du message ne correspond pas au protocole du canal
  • Le ProtocolID dans la structure du message diffère de celui indiqué dans PassThruConnect
  • Solution : Définissez dans pMsg->ProtocolID le même protocole que celui utilisé lors de l'ouverture du canal
ERR_NO_FLOW_CONTROL Pour le protocole ISO 15765, le filtre Flow Control n'est pas établi
  • Tentative de transmission d'un message ISO 15765 sans filtre configuré
  • Solution : Appelez PassThruStartMsgFilter avec le type FLOW_CONTROL_FILTER avant la transmission
ERR_BUFFER_FULL La file de transmission est saturée
  • Trop de messages dans la file (limite : 50 messages, 64 Ko)
  • Solution : Attendez que les messages précédents soient envoyés ou videz la file via PassThruIoctl(CLEAR_TX_BUFFER)
ERR_FAILED Erreur interne dans la bibliothèque ou dans l'adaptateur
  • Erreur d'allocation de mémoire ou défaillance de la pile
  • Solution : Appelez PassThruGetLastError() pour obtenir plus de détails

Exemples

Exemple en C/C++

#include "j2534_dll.hpp"

// ChannelID obtenu précédemment de PassThruConnect
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;

// Création du message ISO 15765 (requête 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);
    // Traitement de l'erreur
}

Exemple en Kotlin (Android)

// channelID obtenu précédemment de ptConnect
val msg = PassThruMsg(
    protocolID = ISO15765,
    dataSize = 7,
    txFlags = ISO15765_FRAME_PAD,
    // Requête 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", "Messages envoyés : ${result.numMsgs}")
} else {
    Log.e("J2534", "Erreur d'envoi : ${result.status}")
}

Exemple en Python

# channel_id obtenu précédemment de 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"Messages envoyés : {num_msgs.value}")
else:
    print(f"Erreur d'envoi : {ret}")

Exemple en C#

// channelId obtenu précédemment de 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($"Messages envoyés : {numMsgs}");
} else {
    Console.WriteLine($"Erreur d'envoi : {ret}");
}