Quantex GmbH
Votre région : Europe

PassThruQueueMsgs v5.0

Mise en file d'attente des messages du canal pour leur transmission

Dernière modification :

Description

La fonction place les messages dans la file d'envoi du dispositif pass-thru pour le canal indiqué. En cas d'exécution réussie, STATUS_NOERROR est renvoyé et la valeur pointée par pNumMsgs est mise à jour et contient le nombre réel de messages mis en file d'attente.

Remarque : Cette fonction remplace PassThruWriteMsgs, qui était utilisée dans les versions précédentes de la SAE J2534 API (v04.04).
long PassThruQueueMsgs(
    unsigned long ChannelID,
    PASSTHRU_MSG *pMsg,
    unsigned long *pNumMsgs
)

Particularités de fonctionnement

Particularités pour les canaux logiques ISO 15765

Les canaux logiques ISO 15765 peuvent mettre en file d'attente une trame unique (single frame) dont l'adresse réseau ou les TxFlags ne correspondent pas à RemoteAddress ou RemoteTxFlags indiqués lors de la création du canal.

Important : Toute tentative de mettre en file d'attente un message segmenté (multi-frame) avec une adresse non concordante provoquera l'erreur ERR_MSG_NOT_ALLOWED.

Paramètres

ChannelID

Paramètre d'entrée. Identifiant du canal de communication physique ou logique, obtenu lors de l'appel à PassThruConnect() ou PassThruLogicalConnect().

pMsg

Paramètre d'entrée. Pointeur vers un tableau de structures PASSTHRU_MSG, alloué par l'application, contenant les messages à mettre en file d'attente.

pNumMsgs

Paramètre d'entrée/sortie. Pointeur vers une variable unsigned long :

Codes d'erreur renvoyés

Code Description
STATUS_NOERROR La fonction s'est exécutée avec succès. Tous les messages ont été mis en file d'attente.
ERR_CONCURRENT_API_CALL Une fonction de la J2534 API a été appelée avant la fin de l'appel précédent
ERR_DEVICE_NOT_OPEN PassThruOpen() n'a pas été appelée avec succès
ERR_INVALID_CHANNEL_ID Valeur de ChannelID non valide
ERR_DEVICE_NOT_CONNECTED Erreur de communication avec le dispositif pass-thru. Le dispositif a été déconnecté.
ERR_NOT_SUPPORTED Le dispositif ne prend pas en charge cette fonction pour le ChannelID indiqué
ERR_NULL_PARAMETER pMsg ou pNumMsgs est NULL
ERR_MSG_PROTOCOL_ID ProtocolID dans la structure PASSTHRU_MSG ne correspond pas au ProtocolID du canal
ERR_INVALID_MSG La structure du message n'est pas valide pour le ChannelID indiqué
ERR_MSG_NOT_ALLOWED Tentative de mise en file d'attente d'un message segmenté avec une adresse/des flags ne correspondant pas aux paramètres du canal logique ISO 15765
ERR_BUFFER_FULL La file d'envoi est pleine. pNumMsgs contient le nombre de messages réellement mis en file d'attente.
ERR_FAILED Erreur indéterminée. Utilisez PassThruGetLastError() pour obtenir la description.

Exemples

Exemple en C/C++

#include "j2534_dll.hpp"

unsigned long channelID = ...; // ID du canal de PassThruConnect/PassThruLogicalConnect

// Préparation du message
PASSTHRU_MSG msg = {0};
msg.ProtocolID = ISO15765;
msg.TxFlags = ISO15765_FRAME_PAD;

// Données : requête UDS Read Data By Identifier (0x22)
unsigned char data[] = {0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90};
memcpy(msg.Data, data, sizeof(data));
msg.DataSize = sizeof(data);

unsigned long numMsgs = 1;

// Mise en file d'attente du message
long ret = PassThruQueueMsgs(channelID, &msg, &numMsgs);

if (ret == STATUS_NOERROR) {
    printf("Messages dans la file : %lu\n", numMsgs);
} else if (ret == ERR_BUFFER_FULL) {
    printf("File pleine, messages mis en file : %lu\n", numMsgs);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Erreur : %s\n", error);
}

Exemple en Python (ctypes)

from ctypes import *

j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")

# Structure PASSTHRU_MSG
class PASSTHRU_MSG(Structure):
    _fields_ = [
        ("ProtocolID", c_ulong),
        ("RxStatus", c_ulong),
        ("TxFlags", c_ulong),
        ("Timestamp", c_ulong),
        ("DataSize", c_ulong),
        ("ExtraDataIndex", c_ulong),
        ("Data", c_ubyte * 4128)
    ]

channel_id = c_ulong(...)  # ID du canal

# Préparation du message
msg = PASSTHRU_MSG()
msg.ProtocolID = 0x06  # ISO15765
msg.TxFlags = 0x40     # ISO15765_FRAME_PAD

# Requête UDS Read Data By Identifier
data = bytes([0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90])
for i, b in enumerate(data):
    msg.Data[i] = b
msg.DataSize = len(data)

num_msgs = c_ulong(1)

# Mise en file d'attente du message
ret = j2534.PassThruQueueMsgs(channel_id, byref(msg), byref(num_msgs))

if ret == 0:  # STATUS_NOERROR
    print(f"Messages dans la file : {num_msgs.value}")
elif ret == 0x11:  # ERR_BUFFER_FULL
    print(f"File pleine, mis en file : {num_msgs.value}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Erreur : {error.value.decode()}")

Comparaison avec PassThruWriteMsgs (v04.04)

Caractéristique PassThruWriteMsgs (v04.04) PassThruQueueMsgs (v05.00)
Comportement Appel bloquant avec délai d'attente Non bloquant, retour immédiat
Paramètre Timeout Oui Non
Prise en charge des canaux logiques Non Oui

Fonctions associées