Mise en file d'attente des messages du canal pour leur transmission
Dernière modification :
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.
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
)
pMsg ne sont pas modifiéesPassThruStartPeriodicMsg)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.
ERR_MSG_NOT_ALLOWED.
Paramètre d'entrée. Identifiant du canal de communication physique ou logique, obtenu lors de l'appel à
PassThruConnect() ou PassThruLogicalConnect().
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.
Paramètre d'entrée/sortie. Pointeur vers une variable unsigned long :
| 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. |
#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);
}
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()}")
| 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 |
PassThruReadMsgs() - Lecture des messages du canalPassThruStartPeriodicMsg() - Démarrage d'un message périodique (priorité plus élevée)PassThruSelect() - Sélection des canaux à surveillerPassThruLogicalConnect() - Création d'un canal logique