Transmisión de mensajes
Última modificación:
La función transmite mensajes mediante el protocolo de diagnóstico. La cola de transmisión del adaptador está dimensionada para 50 mensajes por cola para un canal y dispone de 64 KB de memoria libre para todas las colas. Cuando la cola o toda la memoria libre se llena, la recepción de mensajes en la cola de transmisión se suspende.
long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
PassThruStartMsgFilter. Sin él, la función devolverá el error ERR_NO_FLOW_CONTROL.
PassThruConnect.ERR_TIMEOUT. Si el tiempo de espera es
0, los mensajes se colocan en la cola de transmisión sin esperar la transmisión física, y la función devuelve el control inmediatamente. En este caso no se genera el error ERR_TIMEOUT.| Código | Descripción | Posibles causas y soluciones |
|---|---|---|
| STATUS_NOERROR | La función se ejecutó correctamente | — |
| ERR_DEVICE_NOT_CONNECTED | No hay conexión con el adaptador |
|
| ERR_INVALID_CHANNEL_ID | Se ha indicado un identificador de canal ChannelID inexistente |
|
| ERR_NULL_PARAMETER | No se ha indicado el puntero pMsg o pNumMsgs |
|
| ERR_TIMEOUT | En el tiempo indicado no se pudieron transmitir todos los mensajes |
|
| ERR_INVALID_MSG | Estructura de mensaje incorrecta en pMsg |
|
| ERR_MSG_PROTOCOL_ID | El protocolo del mensaje no coincide con el protocolo del canal |
|
| ERR_NO_FLOW_CONTROL | Para el protocolo ISO 15765 no se ha establecido el filtro Flow Control |
|
| ERR_BUFFER_FULL | La cola de transmisión está desbordada |
|
| ERR_FAILED | Error interno en la biblioteca o en el adaptador |
|
#include "j2534_dll.hpp"
// ChannelID obtenido previamente de PassThruConnect
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;
// Creación del mensaje ISO 15765 (solicitud 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);
// Tratamiento del error
}
// channelID obtenido previamente de ptConnect
val msg = PassThruMsg(
protocolID = ISO15765,
dataSize = 7,
txFlags = ISO15765_FRAME_PAD,
// Solicitud 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", "Mensajes enviados: ${result.numMsgs}")
} else {
Log.e("J2534", "Error de envío: ${result.status}")
}
# channel_id obtenido previamente 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"Mensajes enviados: {num_msgs.value}")
else:
print(f"Error de envío: {ret}")
// channelId obtenido previamente 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($"Mensajes enviados: {numMsgs}");
} else {
Console.WriteLine($"Error de envío: {ret}");
}