Последнее изменение:
J2534 (часто называемый Pass-Thru) — это стандарт, разработанный SAE (Обществом автомобильных инженеров), который решает важную задачу: он позволяет одному и тому же программному обеспечению для диагностики работать с диагностическими адаптерами от разных производителей.
Основная идея:
Представьте, что вы пишете программу для диагностики автомобилей. Без стандарта J2534 вам пришлось бы писать уникальный код для каждого адаптера (K-Line, CAN-адаптер и т.д.), который вы хотите поддержать. Это сложно и дорого.
Стандарт J2534 определяет единый API (программный интерфейс), который производители адаптеров должны реализовать в своих драйверах. Страндарт определяет этот API только как DLL-библиотека для Windows
Для разработчика это означает:
PassThruOpen, PassThruReadMsgs).Таким образом, J2534 — это "мост" между вашим приложением и диагностическим адаптером, который скрывает сложности конкретного оборудования и позволяет сосредоточиться на логике диагностики.
Многие клиенты кроме Windows, хотят использовтаь альтернативные платформы. Мы предлагаем помимо стандартной DLL для Windows, так же библиотеки для Linux, OSX_ а так же мобильных платформ Android и iOS.
Важно понимать, что J2534 — это стандарт для транспортного уровня. Он берёт на себя всю работу по отправке и приёму байтов данных по выбранному физическому интерфейсу (CAN, K-Line и т.д.).
Однако, стандарт J2534 не определяет:
Это остаётся задачей вашего приложения. Вы, как разработчик, должны знать, какие именно байты нужно отправить, чтобы запросить, например, коды ошибок или текущие параметры, и как разобрать ответ от блока управления.
Для этого вам потребуются знания прикладных протоколов диагностики, таких как:
J2534 DLL доставит ваши байты до ЭБУ, но что это за байты и что делать с ответом — решает ваша программа.
Стандарт J2534 является частью большого семейства стандартов, регулирующих автомобильную диагностику. Для глубокого понимания рекомендуется ознакомиться с официальными документами.
Подробная таблица соотношения протоколов и стандартов
Адаптер ScanDoc реализует не полный вариант стандарта J2534-1 и некоторые расширения из J2534-2, а также имеет собственные функции для расширения возможностей.
Работа с J2534-адаптером из вашего приложения обычно следует этому алгоритму:
Каждый производитель J2534-адаптера предоставляет свою реализацию API в виде DLL-файла. При установке драйвера информация об этой DLL (путь к файлу) записывается в реестр Windows.
Ваше приложение должно:
LoadLibrary (в Windows).После загрузки DLL и получения указателей на функции, типичный сеанс диагностики выглядит так:
PassThruOpen(), чтобы инициализировать связь с физическим устройством. В ответ вы получите DeviceID — уникальный идентификатор этого сеанса.
// Пример
unsigned long deviceID;
long result = PassThruOpen(NULL, &deviceID);
PassThruConnect(), чтобы установить логический канал связи с автомобилем по определённому протоколу (например, ISO15765 для CAN-шины). Вы указываете протокол, скорость и другие параметры. В ответ вы получаете ChannelID.
// Пример
unsigned long channelID;
result = PassThruConnect(deviceID, ISO15765, 0, 500000, &channelID);
PassThruStartMsgFilter().
Процесс обмена данными является асинхронным и построен на очередях:
PassThruWriteMsgs() не отправляет сообщение в шину немедленно. Вместо этого, она помещает одно или несколько сообщений в очередь на отправку и сразу же возвращает управление. Драйвер адаптера самостоятельно отправит эти сообщения из очереди, как только появится такая возможность.PassThruReadMsgs() используется для извлечения сообщений из этой очереди.Важное замечание: Библиотека J2534 является однопоточной. Это значит, что все вызовы функций (PassThruWriteMsgs, PassThruReadMsgs и др.) для одного канала должны выполняться строго последовательно. Нельзя вызывать одну функцию, пока не завершилось выполнение предыдущей. Попытка одновременного вызова функций из разных потоков для одного и того же канала приведет к непредсказуемому поведению.
PassThruDisconnect().
// Пример
result = PassThruDisconnect(channelID);
PassThruClose(), чтобы освободить устройство.
// Пример
result = PassThruClose(deviceID);
Этот цикл — основа любого J2534-приложения. В следующих разделах подробно описана каждая функция API и её параметры.
Каждая функция J2534 API возвращает код состояния. Успешное выполнение всегда возвращает STATUS_NOERROR (значение 0). Любое другое значение указывает на конкретную ошибку (например, ERR_TIMEOUT, ERR_INVALID_CHANNEL_ID и т.д.).
Крайне важно проверять возвращаемое значение после каждого вызова функции.
Особый код ошибки — ERR_FAILED. Это общая, неспецифичная ошибка. Только в этом случае следует вызывать функцию PassThruGetLastError(), чтобы получить от драйвера более детальное, текстовое описание проблемы.
// Пример правильной обработки ошибок
long result = PassThruConnect(deviceID, ISO15765, 0, 500000, &channelID);
if (result != STATUS_NOERROR)
{
printf("Ошибка PassThruConnect. Код: %ld\n", result);
// Если ошибка общая, запрашиваем детали
if (result == ERR_FAILED)
{
char errorDescription[80];
PassThruGetLastError(&errorDescription[0], 80);
printf(" Дополнительная информация: %s\n", errorDescription);
}
// Здесь может быть логика обработки других кодов ошибок
// switch (result) { case ERR_TIMEOUT: ... }
return; // Прерываем выполнение
}
Подробное описание каждой функции стандарта J2534 вынесено в справочник функций.