Transmission de messages
Dernière modification :
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)
PassThruStartMsgFilter. Sans lui, la fonction renverra l'erreur ERR_NO_FLOW_CONTROL.
PassThruConnect.ERR_TIMEOUT est renvoyé. Si le délai d'attente est
0, les messages sont placés dans la file de transmission sans attendre la transmission physique, et la fonction rend le contrôle immédiatement. Dans ce cas, l'erreur ERR_TIMEOUT n'est pas générée.| 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 |
|
| ERR_INVALID_CHANNEL_ID | Un identifiant de canal ChannelID inexistant a été indiqué |
|
| ERR_NULL_PARAMETER | Le pointeur pMsg ou pNumMsgs n'est pas indiqué |
|
| ERR_TIMEOUT | Tous les messages n'ont pas pu être transmis dans le délai imparti |
|
| ERR_INVALID_MSG | Structure de message incorrecte dans pMsg |
|
| ERR_MSG_PROTOCOL_ID | Le protocole du message ne correspond pas au protocole du canal |
|
| ERR_NO_FLOW_CONTROL | Pour le protocole ISO 15765, le filtre Flow Control n'est pas établi |
|
| ERR_BUFFER_FULL | La file de transmission est saturée |
|
| ERR_FAILED | Erreur interne dans la bibliothèque ou dans l'adaptateur |
|
#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
}
// 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}")
}
# 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}")
// 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}");
}