Запуск периодического сообщения
Последнее изменение:
Запускает автоматическую периодическую отправку сообщения на шину с заданным интервалом. Используется для поддержания диагностической сессии (Tester Present) или периодического опроса датчиков.
long PassThruStartPeriodicMsg(unsigned long ChannelID, PASSTHRU_MSG* pMsg, unsigned long* pMsgID, unsigned long TimeInterval)
PassThruConnect.PassThruStopPeriodicMsg.| Код | Описание | Возможные причины и решения |
|---|---|---|
| STATUS_NOERROR | Функция выполнена успешно | — |
| ERR_NULL_PARAMETER | Не задан указатель pMsg |
|
| ERR_INVALID_MSG | Некорректная структура сообщения |
|
| ERR_INVALID_CHANNEL_ID | Недействительный идентификатор канала |
|
| ERR_DEVICE_NOT_CONNECTED | Нет соединения с адаптером |
|
| ERR_INVALID_DEVICE_ID | Недействительный идентификатор устройства |
|
| ERR_INVALID_TIME_INTERVAL | Недопустимый интервал времени |
|
| ERR_NOT_SUPPORTED | Параметры не поддерживаются адаптером |
|
| ERR_MSG_PROTOCOL_ID | Несоответствие протокола |
|
| ERR_EXCEEDED_LIMIT | Превышен лимит периодических сообщений |
|
| ERR_FAILED | Внутренняя ошибка |
|
#include "j2534_lib.hpp"
unsigned long ChannelID; // ID канала
unsigned long MsgID; // ID для нового периодического сообщения
long Ret;
PASSTHRU_MSG Msg;
// Сообщение "Tester Present" для ISO15765
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.DataSize = 5;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF; // Адрес ЭБУ
Msg.Data[4] = 0x3E; // Команда Tester Present
// Запускаем отправку каждые 2000 мс
Ret = PassThruStartPeriodicMsg(ChannelID, &Msg, &MsgID, 2000);
if (Ret != STATUS_NOERROR)
{
// Обработка ошибки
}
// channelID получен ранее
val timeInterval = 2000 // ms
// Сообщение "Tester Present" для ISO15765
val msg = PassThruMsg(
protocolID = ISO15765,
dataSize = 5,
txFlags = ISO15765_FRAME_PAD,
data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x3E)
)
val result = j2534.ptStartPeriodicMsg(channelID, msg, timeInterval)
if (result.status == STATUS_NOERROR) {
val msgID = result.msgId
// Периодическое сообщение успешно запущено
Log.i("J2534", "Запущено периодическое сообщение, MsgID: $msgID")
} else {
// Обработка ошибки
Log.e("J2534", "Ошибка запуска периодического сообщения: ${result.status}")
}
import ctypes
# Загрузка библиотеки
j2534 = ctypes.CDLL("libj2534_v04_04.so") # Linux
# j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll") # Windows
# channel_id получен ранее
time_interval = 2000 # мс
# Структура сообщения
class PASSTHRU_MSG(ctypes.Structure):
_fields_ = [
("ProtocolID", ctypes.c_ulong),
("RxStatus", ctypes.c_ulong),
("TxFlags", ctypes.c_ulong),
("Timestamp", ctypes.c_ulong),
("DataSize", ctypes.c_ulong),
("ExtraDataIndex", ctypes.c_ulong),
("Data", ctypes.c_ubyte * 4128)
]
msg = PASSTHRU_MSG()
msg.ProtocolID = 6 # ISO15765
msg.TxFlags = 0x40 # ISO15765_FRAME_PAD
msg.DataSize = 5
msg.Data[0:5] = [0x00, 0x00, 0x07, 0xDF, 0x3E] # Tester Present
msg_id = ctypes.c_ulong()
ret = j2534.PassThruStartPeriodicMsg(channel_id, ctypes.byref(msg), ctypes.byref(msg_id), time_interval)
if ret == 0: # STATUS_NOERROR
print(f"Периодическое сообщение запущено, MsgID: {msg_id.value}")
using System;
using System.Runtime.InteropServices;
// channel_id получен ранее
uint timeInterval = 2000; // мс
var msg = new PASSTHRU_MSG
{
ProtocolID = 6, // ISO15765
TxFlags = 0x40, // ISO15765_FRAME_PAD
DataSize = 5,
Data = new byte[4128]
};
msg.Data[0] = 0x00;
msg.Data[1] = 0x00;
msg.Data[2] = 0x07;
msg.Data[3] = 0xDF;
msg.Data[4] = 0x3E; // Tester Present
uint msgId;
int ret = J2534.PassThruStartPeriodicMsg(channelId, ref msg, out msgId, timeInterval);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Периодическое сообщение запущено, MsgID: {msgId}");
}