Quantex GmbH
Ваш регион: Европа

PassThruQueueMsgs v5.0

Постановка сообщений в очередь канала для передачи

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

Описание

Функция помещает сообщения в очередь передачи устройства pass-thru для указанного канала. При успешном выполнении возвращается STATUS_NOERROR, а значение по указателю pNumMsgs обновляется и содержит фактическое количество поставленных в очередь сообщений.

Примечание: Эта функция заменяет PassThruWriteMsgs, которая использовалась в предыдущих версиях SAE J2534 API (v04.04).
long PassThruQueueMsgs(
    unsigned long ChannelID,
    PASSTHRU_MSG *pMsg,
    unsigned long *pNumMsgs
)

Особенности работы

Особенности для ISO 15765 логических каналов

Логические каналы ISO 15765 могут ставить в очередь одиночный кадр (single frame), сетевой адрес или TxFlags которого не совпадают с RemoteAddress или RemoteTxFlags, указанными при создании канала.

Важно: Попытка поставить в очередь сегментированное сообщение (multi-frame) с несовпадающим адресом приведёт к ошибке ERR_MSG_NOT_ALLOWED.

Параметры

ChannelID

Входной параметр. Идентификатор физического или логического канала связи, полученный при вызове PassThruConnect() или PassThruLogicalConnect().

pMsg

Входной параметр. Указатель на массив структур PASSTHRU_MSG, выделенный приложением, содержащий сообщения для постановки в очередь.

pNumMsgs

Входной/выходной параметр. Указатель на переменную unsigned long:

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

Код Описание
STATUS_NOERROR Функция выполнена успешно. Все сообщения поставлены в очередь.
ERR_CONCURRENT_API_CALL Функция J2534 API вызвана до завершения предыдущего вызова
ERR_DEVICE_NOT_OPEN PassThruOpen() не был успешно вызван
ERR_INVALID_CHANNEL_ID Недопустимое значение ChannelID
ERR_DEVICE_NOT_CONNECTED Ошибка связи с устройством pass-thru. Устройство было отключено.
ERR_NOT_SUPPORTED Устройство не поддерживает эту функцию для данного ChannelID
ERR_NULL_PARAMETER pMsg или pNumMsgs равен NULL
ERR_MSG_PROTOCOL_ID ProtocolID в структуре PASSTHRU_MSG не соответствует ProtocolID канала
ERR_INVALID_MSG Структура сообщения недопустима для данного ChannelID
ERR_MSG_NOT_ALLOWED Попытка поставить в очередь сегментированное сообщение с адресом/флагами, не соответствующими параметрам логического канала ISO 15765
ERR_BUFFER_FULL Очередь передачи заполнена. pNumMsgs содержит количество фактически поставленных в очередь сообщений.
ERR_FAILED Неопределённая ошибка. Используйте PassThruGetLastError() для получения описания.

Примеры

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

#include "j2534_dll.hpp"

unsigned long channelID = ...; // ID канала из PassThruConnect/PassThruLogicalConnect

// Подготовка сообщения
PASSTHRU_MSG msg = {0};
msg.ProtocolID = ISO15765;
msg.TxFlags = ISO15765_FRAME_PAD;

// Данные: 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;

// Ставим сообщение в очередь
long ret = PassThruQueueMsgs(channelID, &msg, &numMsgs);

if (ret == STATUS_NOERROR) {
    printf("Сообщений в очереди: %lu\n", numMsgs);
} else if (ret == ERR_BUFFER_FULL) {
    printf("Очередь заполнена, поставлено сообщений: %lu\n", numMsgs);
} else {
    char error[256];
    PassThruGetLastError(error);
    printf("Ошибка: %s\n", error);
}

Пример на Python (ctypes)

from ctypes import *

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

# Структура 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 канала

# Подготовка сообщения
msg = PASSTHRU_MSG()
msg.ProtocolID = 0x06  # ISO15765
msg.TxFlags = 0x40     # ISO15765_FRAME_PAD

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

# Ставим сообщение в очередь
ret = j2534.PassThruQueueMsgs(channel_id, byref(msg), byref(num_msgs))

if ret == 0:  # STATUS_NOERROR
    print(f"Сообщений в очереди: {num_msgs.value}")
elif ret == 0x11:  # ERR_BUFFER_FULL
    print(f"Очередь заполнена, поставлено: {num_msgs.value}")
else:
    error = create_string_buffer(256)
    j2534.PassThruGetLastError(error)
    print(f"Ошибка: {error.value.decode()}")

Сравнение с PassThruWriteMsgs (v04.04)

Характеристика PassThruWriteMsgs (v04.04) PassThruQueueMsgs (v05.00)
Поведение Блокирующий вызов с таймаутом Неблокирующий, немедленный возврат
Параметр Timeout Есть Нет
Поддержка логических каналов Нет Да

Связанные функции