Передача сообщений
Последнее изменение:
Функция передаёт сообщения по диагностическому протоколу. Передающая очередь адаптера рассчитана на 50 сообщений на одну очередь для одного канала и имеет 64 Кбайт свободной памяти для всех очередей. При заполнении очереди или всей свободной памяти приём сообщений в передающую очередь приостанавливается.
long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
PassThruStartMsgFilter. Без него функция вернёт ошибку ERR_NO_FLOW_CONTROL.
PassThruConnect.ERR_TIMEOUT. Если тайм-аут равен 0, сообщения помещаются в передающую очередь без ожидания физической передачи, и функция возвращается немедленно. В этом случае ошибка ERR_TIMEOUT не генерируется.| Код | Описание | Возможные причины и решения |
|---|---|---|
| STATUS_NOERROR | Функция выполнена успешно | — |
| ERR_DEVICE_NOT_CONNECTED | Нет соединения с адаптером |
|
| ERR_INVALID_CHANNEL_ID | Задан несуществующий идентификатор канала ChannelID |
|
| ERR_NULL_PARAMETER | Не задан указатель pMsg или pNumMsgs |
|
| ERR_TIMEOUT | За заданное время не удалось передать все сообщения |
|
| ERR_INVALID_MSG | Неправильная структура сообщения в pMsg |
|
| ERR_MSG_PROTOCOL_ID | Протокол в сообщении не совпадает с протоколом канала |
|
| ERR_NO_FLOW_CONTROL | Для протокола ISO 15765 не установлен Flow Control фильтр |
|
| ERR_BUFFER_FULL | Очередь передачи переполнена |
|
| ERR_FAILED | Внутренняя ошибка в библиотеке или адаптере |
|
#include "j2534_dll.hpp"
// ChannelID получен ранее от PassThruConnect
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;
// Формирование сообщения ISO 15765 (запрос 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);
// Обработка ошибки
}
// channelID получен ранее от ptConnect
val msg = PassThruMsg(
protocolID = ISO15765,
dataSize = 7,
txFlags = ISO15765_FRAME_PAD,
// Запрос 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", "Отправлено сообщений: ${result.numMsgs}")
} else {
Log.e("J2534", "Ошибка отправки: ${result.status}")
}
# channel_id получен ранее от 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"Отправлено сообщений: {num_msgs.value}")
else:
print(f"Ошибка отправки: {ret}")
// channelId получен ранее от 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($"Отправлено сообщений: {numMsgs}");
} else {
Console.WriteLine($"Ошибка отправки: {ret}");
}