Создание соединения по протоколу
Последнее изменение:
Функция устанавливает связь по заданному протоколу. Адаптер поддерживает две независимых диагностические линии. Каждый протокол связан со своей линией. Линия 1 подключена к выводам 6 и 14 OBD разъёма и к ней могут подключаться только протоколы
ISO15768 И CAN. Линия 2 коммутируемая, и к ней могут подключаться остальные протоколы. Так как линии независимые, то допускается одновременная работа двух протоколов. Например ISO15765 и ISO14230 или ISO15765 и ISO15765_PS. Приставка PS означает,
что протокол может коммутироваться на выводы OBD разъёма.
Протоколы ISO15765 и CAN а так же ISO15765_PS и CAN_PS могут работать на одной физической линии одновременно. Это означает, что вы можете инициализировать в одном адаптере одновременно
до 4 протоколов. При этом необходимо учитывать, что устанавливаемые скорости для каждой пары протоколов должны быть одинаковыми. Например ISO15765 и CAN со скоростью 500 Кбит на 6 и 14 выводах OBD разъёма и ISO15765_PS и CAN_PS со скоростью
125 Кбит на 3 и 11 выводах.
long PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long BaudRate, unsigned long *pChannelID)
| Определение | выводы | Описание |
|---|---|---|
| J1850VPW | 2 VPW | Определён стандартами SAE J1850 и SAE J2178 Может одновременно работать с CAN и ISO15765, Не совместим с коммутируемыми протоколами. |
| J1850PWM | 2, 10 PWM | Определён стандартом SAE J1850 Может одновременно работать с CAN и ISO15765, Не совместим с коммутируемыми протоколами. |
| ISO9141 | 7K,15L Line | Определён стандартами ISO 9141 и SAE J1979 Может одновременно работать с CAN и ISO15765, Не совместим с коммутируемыми протоколами. |
| ISO14230 | 7K,15L Line | |
| CAN | 6H,14L CAN | Не обработанный CAN поток. Может одновременно работать со всеми протоколами. |
| ISO15765 | 6H,14L CAN | Определён стандартами ISO 15765-4 и ISO 14229-1 UDS Может одновременно работать со всеми протоколами. |
| ISO15765_PS | Коммутируемый CAN | Коммутируемая версия ISO 15765. Может одновременно работать с CAN и ISO15765. |
| Полный список протоколов см. в стандарте SAE J2534-1. | ||
| Название константы | бит | Описание |
|---|---|---|
| ISO9141_K_LINE | 12 | Использование L линии для инициализации протоколов. 0 = Используется L-линия и K-линия для инициализации 1 = Используется только K-линия для инициализации |
| CAN_29BIT_ID | 8 | Тип CAN идентификатора для протоколов CAN и ISO 15765 0 = Принимаются пакеты с 11 битным идентификатором. 1 = Принимаются пакеты с 29 битным идентификатором. |
| Полный список флагов см. в стандарте SAE J2534-1. | ||
| Код | Описание | Возможные причины и решения |
|---|---|---|
| STATUS_NOERROR | Функция выполнена успешно | — |
| ERR_DEVICE_NOT_CONNECTED | Нет соединения с адаптером |
|
| ERR_INVALID_DEVICE_ID | Задан несуществующий идентификатор адаптера DeviceID |
|
| ERR_NOT_SUPPORTED | Протокол не поддерживается адаптером |
|
| ERR_INVALID_PROTOCOL_ID v4.04 ERR_PROTOCOL_ID_NOT_SUPPORTED v5.0 |
Задан несуществующий ProtocolID |
|
| ERR_NULL_PARAMETER | Не задан указатель pChannelID |
|
| ERR_INVALID_FLAGS v4.04 ERR_FLAG_NOT_SUPPORTED v5.0 |
Задан неподдерживаемый флаг |
|
| ERR_BAUDRATE_NOT_SUPPORTED | Задана неподдерживаемая скорость обмена |
|
| ERR_CHANNEL_IN_USE | Канал уже используется |
Важно: В реальности этот код ошибки никогда не появится, так как при повторном вызове PassThruConnect произойдёт автоматический вызов PassThruDisconnect и канал будет переоткрыт.
|
| ERR_FAILED | Внутренняя ошибка |
|
#include "j2534_dll.hpp"
// DeviceID получен ранее от PassThruOpen
unsigned long DeviceID;
unsigned long ChannelID;
unsigned long Flags = 0; // Зависит от протокола
// Соединение по CAN-шине ISO 15765 на скорости 500 Кбит/с
long ret = PassThruConnect(DeviceID, ISO15765, Flags, 500000, &ChannelID);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
// Обработка ошибки
}
// deviceID получен ранее от ptOpen
val protocolID = ISO15765
val flags = 0
val baudRate = 500000
val resConnect = j2534.ptConnect(deviceID, protocolID, flags, baudRate)
if (resConnect.status == STATUS_NOERROR) {
val channelID = resConnect.сhnlId
// Канал связи с автомобилем открыт
Log.i("J2534", "Канал открыт, ChannelID: $channelID")
} else {
// Обработка ошибки
Log.e("J2534", "Ошибка открытия канала: ${resConnect.status}")
}
import ctypes
# Загрузка библиотеки
# Windows: j2534 = ctypes.WinDLL("j2534sd_v04_04_x64.dll")
# macOS: j2534 = ctypes.CDLL("libj2534_v04_04.dylib")
# Linux: j2534 = ctypes.CDLL("libj2534_v04_04.so")
ISO15765 = 6
STATUS_NOERROR = 0
# device_id получен ранее от PassThruOpen
device_id = ctypes.c_ulong(0)
channel_id = ctypes.c_ulong()
protocol_id = ISO15765
flags = 0
baud_rate = 500000
ret = j2534.PassThruConnect(device_id, protocol_id, flags, baud_rate, ctypes.byref(channel_id))
if ret == STATUS_NOERROR:
print(f"Канал открыт, ChannelID: {channel_id.value}")
else:
error_msg = ctypes.create_string_buffer(256)
j2534.PassThruGetLastError(error_msg)
print(f"Ошибка: {error_msg.value.decode()}")
using System;
using System.Runtime.InteropServices;
public class J2534Example
{
// Windows: j2534sd_v04_04_x64.dll
[DllImport("j2534sd_v04_04_x64.dll")]
public static extern int PassThruConnect(uint deviceId, uint protocolId,
uint flags, uint baudRate, out uint channelId);
[DllImport("j2534sd_v04_04_x64.dll")]
public static extern int PassThruGetLastError(byte[] errorMsg);
const uint ISO15765 = 6;
const int STATUS_NOERROR = 0;
public void ConnectExample(uint deviceId)
{
uint channelId;
uint flags = 0;
uint baudRate = 500000;
int ret = PassThruConnect(deviceId, ISO15765, flags, baudRate, out channelId);
if (ret == STATUS_NOERROR)
{
Console.WriteLine($"Канал открыт, ChannelID: {channelId}");
}
else
{
byte[] errorMsg = new byte[256];
PassThruGetLastError(errorMsg);
Console.WriteLine($"Ошибка: {System.Text.Encoding.ASCII.GetString(errorMsg)}");
}
}
}