Постановка сообщений в очередь канала для передачи
Последнее изменение:
Функция помещает сообщения в очередь передачи устройства pass-thru для указанного канала.
При успешном выполнении возвращается STATUS_NOERROR, а значение по указателю pNumMsgs
обновляется и содержит фактическое количество поставленных в очередь сообщений.
PassThruWriteMsgs,
которая использовалась в предыдущих версиях SAE J2534 API (v04.04).
long PassThruQueueMsgs(
unsigned long ChannelID,
PASSTHRU_MSG *pMsg,
unsigned long *pNumMsgs
)
pMsg, не изменяютсяPassThruStartPeriodicMsg)Логические каналы ISO 15765 могут ставить в очередь одиночный кадр (single frame), сетевой адрес или
TxFlags которого не совпадают с RemoteAddress или RemoteTxFlags,
указанными при создании канала.
ERR_MSG_NOT_ALLOWED.
Входной параметр. Идентификатор физического или логического канала связи, полученный при вызове
PassThruConnect() или PassThruLogicalConnect().
Входной параметр. Указатель на массив структур PASSTHRU_MSG, выделенный приложением,
содержащий сообщения для постановки в очередь.
Входной/выходной параметр. Указатель на переменную 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() для получения описания. |
#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);
}
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) | PassThruQueueMsgs (v05.00) |
|---|---|---|
| Поведение | Блокирующий вызов с таймаутом | Неблокирующий, немедленный возврат |
| Параметр Timeout | Есть | Нет |
| Поддержка логических каналов | Нет | Да |
PassThruReadMsgs() - Чтение сообщений из каналаPassThruStartPeriodicMsg() - Запуск периодического сообщения (более высокий приоритет)PassThruSelect() - Выбор каналов для мониторингаPassThruLogicalConnect() - Создание логического канала