Quantex GmbH
DE RU EN EL
Ваш регион: Европа

PassThruWriteMsgs v4.04

Передача сообщений

Последнее изменение:

Описание

Функция передаёт сообщения по диагностическому протоколу. Передающая очередь адаптера рассчитана на 50 сообщений на одну очередь для одного канала и имеет 64 Кбайт свободной памяти для всех очередей. При заполнении очереди или всей свободной памяти приём сообщений в передающую очередь приостанавливается.

long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
Важно: Для протокола ISO 15765 перед передачей сообщений необходимо установить Flow Control фильтр с помощью PassThruStartMsgFilter. Без него функция вернёт ошибку ERR_NO_FLOW_CONTROL.

Параметры

Возвращаемые коды ошибок

Код Описание Возможные причины и решения
STATUS_NOERROR Функция выполнена успешно
ERR_DEVICE_NOT_CONNECTED Нет соединения с адаптером
  • Адаптер выключен или потеряна связь
  • Решение: Проверьте питание адаптера и сетевое/BLE-соединение
  • Неправильно задан IP-адрес
  • Решение: Проверьте параметры подключения в PassThruOpen
ERR_INVALID_CHANNEL_ID Задан несуществующий идентификатор канала ChannelID
  • ChannelID не был получен от PassThruConnect
  • Решение: Используйте ChannelID, возвращённый функцией PassThruConnect
  • Канал был закрыт через PassThruDisconnect
  • Решение: Откройте канал заново через PassThruConnect
ERR_NULL_PARAMETER Не задан указатель pMsg или pNumMsgs
  • Передан NULL вместо указателя
  • Решение: Передайте корректный указатель на массив сообщений и переменную количества
ERR_TIMEOUT За заданное время не удалось передать все сообщения
  • Слишком много сообщений или короткий тайм-аут
  • Решение: Увеличьте значение Timeout или уменьшите количество сообщений
  • Проблемы на шине (нет подтверждения CAN)
  • Решение: Проверьте подключение к автомобилю и состояние шины
ERR_INVALID_MSG Неправильная структура сообщения в pMsg
  • Некорректные данные или размер сообщения
  • Решение: Проверьте поля DataSize, Data и TxFlags в структуре PASSTHRU_MSG
ERR_MSG_PROTOCOL_ID Протокол в сообщении не совпадает с протоколом канала
  • ProtocolID в структуре сообщения отличается от заданного в PassThruConnect
  • Решение: Установите в pMsg->ProtocolID тот же протокол, что использовался при открытии канала
ERR_NO_FLOW_CONTROL Для протокола ISO 15765 не установлен Flow Control фильтр
  • Попытка передачи ISO 15765 сообщения без настроенного фильтра
  • Решение: Вызовите PassThruStartMsgFilter с типом FLOW_CONTROL_FILTER перед передачей
ERR_BUFFER_FULL Очередь передачи переполнена
  • Слишком много сообщений в очереди (лимит: 50 сообщений, 64 КБ)
  • Решение: Дождитесь отправки предыдущих сообщений или очистите очередь через PassThruIoctl(CLEAR_TX_BUFFER)
ERR_FAILED Внутренняя ошибка в библиотеке или адаптере
  • Ошибка выделения памяти или сбой стека
  • Решение: Вызовите PassThruGetLastError() для получения подробностей

Примеры

Пример на C/C++

#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);
    // Обработка ошибки
}

Пример на Kotlin (Android)

// 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}")
}

Пример на Python

# 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}")

Пример на C#

// 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}");
}