Quantex GmbH
DE RU EN EL
Η περιοχή σας: Ευρώπη

GET_DEVICE_INFO / GET_PROTOCOL_INFO J2534-2

Πληροφορίες συσκευής

Τελευταία τροποποίηση:

GET_DEVICE_INFO — Πληροφορίες συσκευής

Επιστρέφει πληροφορίες σχετικά με τις δυνατότητες της συσκευής: υποστηριζόμενα πρωτόκολλα, αριθμό ταυτόχρονων καναλιών, σειριακό αριθμό και άλλα χαρακτηριστικά. Καλείται με το DeviceID που λαμβάνεται από την PassThruOpen.

IoctlID 0x800C
pInput SCONFIG_LIST* — λίστα των ζητούμενων παραμέτρων
pOutput NULL (το αποτέλεσμα γράφεται στο pInput)
Σε αντίθεση με την GET_CONFIG, η λειτουργία GET_DEVICE_INFO καλείται με DeviceID, όχι με ChannelID.

GET_PROTOCOL_INFO — Πληροφορίες πρωτοκόλλου

Επιστρέφει πληροφορίες σχετικά με τις δυνατότητες ενός συγκεκριμένου πρωτοκόλλου: μέγιστα μεγέθη buffer, αριθμό φίλτρων, υποστηριζόμενες παραμέτρους. Καλείται με το ChannelID που λαμβάνεται από την PassThruConnect.

IoctlID 0x800D
pInput SCONFIG_LIST* — λίστα των ζητούμενων παραμέτρων
pOutput NULL (το αποτέλεσμα γράφεται στο pInput)

Δομές δεδομένων

typedef struct {
    unsigned long Parameter;  // Αναγνωριστικό παραμέτρου
    unsigned long Value;      // Επιστρεφόμενη τιμή
} SCONFIG;

typedef struct {
    unsigned long NumOfParams;  // Αριθμός παραμέτρων στη λίστα
    SCONFIG *ConfigPtr;         // Δείκτης σε πίνακα SCONFIG
} SCONFIG_LIST;

Κωδικοί σφάλματος επιστροφής

Κωδικός Περιγραφή Πιθανές αιτίες και λύσεις
STATUS_NOERROR Η λειτουργία ολοκληρώθηκε επιτυχώς
ERR_DEVICE_NOT_CONNECTED Δεν υπάρχει σύνδεση με τον προσαρμογέα
  • Ο προσαρμογέας είναι απενεργοποιημένος ή εκτός εμβέλειας
  • Λύση: ελέγξτε την τροφοδοσία και τη σύνδεση
ERR_INVALID_DEVICE_ID Μη έγκυρο αναγνωριστικό συσκευής
  • Το DeviceID δεν ελήφθη μέσω PassThruOpen
  • Λύση: εκτελέστε PassThruOpen
ERR_INVALID_CHANNEL_ID Μη έγκυρο αναγνωριστικό καναλιού
  • Το ChannelID δεν ελήφθη μέσω PassThruConnect (για GET_PROTOCOL_INFO)
  • Λύση: εκτελέστε PassThruConnect
ERR_NULL_PARAMETER Δόθηκε NULL αντί για δείκτη
  • Το pInput είναι NULL
  • Λύση: περάστε δείκτη σε SCONFIG_LIST
ERR_NOT_SUPPORTED Η παράμετρος δεν υποστηρίζεται
  • Η ζητούμενη παράμετρος δεν είναι διαθέσιμη
  • Λύση: ελέγξτε τη λίστα των υποστηριζόμενων παραμέτρων
ERR_FAILED Απροσδιόριστο σφάλμα
  • Εσωτερικό σφάλμα
  • Λύση: καλέστε την PassThruGetLastError()

Παράμετροι της GET_DEVICE_INFO

Αναγνώριση συσκευής

Παράμετρος Τιμή Περιγραφή
SERIAL_NUMBER 0x01 Σειριακός αριθμός της συσκευής (συμβολοσειρά)
PART_NUMBER 0x49 Κωδικός ανταλλακτικού της συσκευής

Υποστήριξη πρωτοκόλλων

Επιστρέφουν SUPPORTED (1) ή NOT_SUPPORTED (0).

Παράμετρος Τιμή Πρωτόκολλο
J1850PWM_SUPPORTED 0x02 J1850 PWM (Ford)
J1850VPW_SUPPORTED 0x03 J1850 VPW (GM)
ISO9141_SUPPORTED 0x04 ISO 9141-2
ISO14230_SUPPORTED 0x05 ISO 14230 (KWP2000)
CAN_SUPPORTED 0x06 CAN (raw)
ISO15765_SUPPORTED 0x07 ISO 15765 (CAN UDS)
SCI_A_ENGINE_SUPPORTED 0x08 SCI-A Engine (Chrysler)
SCI_A_TRANS_SUPPORTED 0x09 SCI-A Transmission (Chrysler)
SCI_B_ENGINE_SUPPORTED 0x0A SCI-B Engine (Chrysler)
SCI_B_TRANS_SUPPORTED 0x0B SCI-B Transmission (Chrysler)
SW_ISO15765_SUPPORTED 0x0C Single-Wire ISO 15765
SW_CAN_SUPPORTED 0x0D Single-Wire CAN (GM)
GM_UART_SUPPORTED 0x0E GM UART
UART_ECHO_BYTE_SUPPORTED 0x0F UART Echo Byte
HONDA_DIAGH_SUPPORTED 0x10 Honda DIAG-H
J1939_SUPPORTED 0x11 J1939 (φορτηγά)
J1708_SUPPORTED 0x12 J1708 (φορτηγά)
TP2_0_SUPPORTED 0x13 TP 2.0 (VAG)
J2610_SUPPORTED 0x14 J2610 (Chrysler DRB-III)
ANALOG_IN_SUPPORTED 0x15 Αναλογικές είσοδοι
FT_CAN_SUPPORTED 0x31 Fault-Tolerant CAN
FT_ISO15765_SUPPORTED 0x32 FT ISO 15765
FD_CAN_SUPPORTED 0x4C CAN FD
FD_ISO15765_SUPPORTED 0x4D ISO 15765 μέσω CAN FD
ETHERNET_NDIS_SUPPORTED 0x54 Ethernet NDIS (DoIP)

Ταυτόχρονα κανάλια

Αριθμός καναλιών που μπορούν να είναι ταυτόχρονα ανοιχτά για κάθε πρωτόκολλο.

Παράμετρος Τιμή Πρωτόκολλο
J1850PWM_SIMULTANEOUS 0x35 J1850 PWM
J1850VPW_SIMULTANEOUS 0x36 J1850 VPW
ISO9141_SIMULTANEOUS 0x37 ISO 9141
ISO14230_SIMULTANEOUS 0x38 ISO 14230
CAN_SIMULTANEOUS 0x39 CAN
ISO15765_SIMULTANEOUS 0x3A ISO 15765
SW_CAN_SIMULTANEOUS 0x40 SW-CAN
J1939_SIMULTANEOUS 0x44 J1939
TP2_0_SIMULTANEOUS 0x46 TP 2.0
FD_CAN_SIMULTANEOUS 0x4E CAN FD
FD_ISO15765_SIMULTANEOUS 0x4F ISO 15765 FD

Αντιστοίχιση ακροδεκτών J1962

Επιστρέφουν τη μάσκα των ακροδεκτών OBD-II που χρησιμοποιούνται από το πρωτόκολλο.

Παράμετρος Τιμή Πρωτόκολλο
CAN_PS_J1962 0x1F CAN (Pin 6, 14)
ISO15765_PS_J1962 0x20 ISO 15765 (Pin 6, 14)
ISO9141_PS_K_LINE_J1962 0x1B ISO 9141 K-Line (Pin 7)
ISO9141_PS_L_LINE_J1962 0x1C ISO 9141 L-Line (Pin 15)
ISO14230_PS_K_LINE_J1962 0x1D ISO 14230 K-Line (Pin 7)
ISO14230_PS_L_LINE_J1962 0x1E ISO 14230 L-Line (Pin 15)
SW_CAN_PS_J1962 0x21 SW-CAN (Pin 1)
J1850PWM_PS_J1962 0x19 J1850 PWM (Pin 2, 10)
J1850VPW_PS_J1962 0x1A J1850 VPW (Pin 2)
FD_CAN_PS_J1962 0x50 CAN FD (Pin 6, 14)
FD_ISO15765_PS_J1962 0x51 ISO 15765 FD (Pin 6, 14)

Πρόσθετες δυνατότητες

Παράμετρος Τιμή Περιγραφή
MAX_NON_VOLATILE_STORAGE 0x16 Μέγεθος μη πτητικής μνήμης (byte)
SHORT_TO_GND_J1962 0x17 Υποστήριξη ανίχνευσης βραχυκυκλώματος προς τη γείωση
PGM_VOLTAGE_J1962 0x18 Υποστήριξη τάσης προγραμματισμού
READ_J1962PIN_VOLTAGE_SUPPORTED 0x52 Υποστήριξη ανάγνωσης τάσης ακροδεκτών
READ_J1962PIN_VOLTAGE_MAX 0x53 Μέγιστη αναγνώσιμη τάση (mV)

Παράμετροι της GET_PROTOCOL_INFO

Παράμετρος Τιμή Περιγραφή
MAX_RX_BUFFER_SIZE 0x01 Μέγιστο μέγεθος buffer λήψης (byte)
MAX_PASS_FILTER 0x02 Μέγιστος αριθμός PASS_FILTER
MAX_BLOCK_FILTER 0x03 Μέγιστος αριθμός BLOCK_FILTER
MAX_FILTER_MSG_LENGTH 0x04 Μέγιστο μήκος μηνύματος φίλτρου (byte)
MAX_PERIODIC_MSGS 0x05 Μέγιστος αριθμός περιοδικών μηνυμάτων
MAX_PERIODIC_MSG_LENGTH 0x06 Μέγιστο μήκος περιοδικού μηνύματος (byte)
DESIRED_DATA_RATE 0x07 Προτεινόμενος ρυθμός μετάδοσης (bit/s)
MAX_FLOW_CONTROL_FILTER 0x12 Μέγιστος αριθμός FLOW_CONTROL_FILTER
MAX_ISO15765_WFT_MAX 0x13 Μέγιστη τιμή του ISO15765_WFT_MAX
NETWORK_LINE_SUPPORTED 0x0A Υποστήριξη επιλογής γραμμής δικτύου
MAX_FUNCT_MSG_LOOKUP 0x0B Μέγιστο μέγεθος πίνακα λειτουργικών διευθύνσεων
PARITY_SUPPORTED 0x0C Υποστήριξη ρύθμισης ισοτιμίας
DATA_BITS_SUPPORTED 0x0D Υποστήριξη ρύθμισης bit δεδομένων (7/8)
FIVE_BAUD_MOD_SUPPORTED 0x0E Υποστήριξη λειτουργιών αρχικοποίησης 5 baud
L_LINE_SUPPORTED 0x0F Υποστήριξη γραμμής L
CAN_11_29_IDS_SUPPORTED 0x10 Υποστήριξη 11-bit και 29-bit CAN ID
CAN_MIXED_FORMAT_SUPPORTED 0x11 Υποστήριξη μικτής μορφής CAN
TIMESTAMP_RESOLUTION 0x1B Ανάλυση χρονικής σήμανσης (µs)
FD_CAN_DATA_PHASE_DATA_RATE_SUPPORTED 0x6C Υποστηριζόμενοι ρυθμοί CAN FD

Παραδείγματα

GET_DEVICE_INFO — λήψη δυνατοτήτων συσκευής

Παράδειγμα σε C/C++

#include "j2534_dll.hpp"

unsigned long DeviceID;  // Ελήφθη από την PassThruOpen
SCONFIG Config[5];
SCONFIG_LIST ConfigList;
long ret;

// Ζητάμε πληροφορίες για την υποστήριξη πρωτοκόλλων
Config[0].Parameter = CAN_SUPPORTED;
Config[1].Parameter = ISO15765_SUPPORTED;
Config[2].Parameter = ISO14230_SUPPORTED;
Config[3].Parameter = FD_CAN_SUPPORTED;
Config[4].Parameter = TP2_0_SUPPORTED;

ConfigList.NumOfParams = 5;
ConfigList.ConfigPtr = Config;

ret = PassThruIoctl(DeviceID, GET_DEVICE_INFO, &ConfigList, NULL);
if (ret == STATUS_NOERROR)
{
    printf("CAN: %s\n", Config[0].Value ? "υποστηρίζεται" : "όχι");
    printf("ISO 15765: %s\n", Config[1].Value ? "υποστηρίζεται" : "όχι");
    printf("ISO 14230: %s\n", Config[2].Value ? "υποστηρίζεται" : "όχι");
    printf("CAN FD: %s\n", Config[3].Value ? "υποστηρίζεται" : "όχι");
    printf("TP 2.0: %s\n", Config[4].Value ? "υποστηρίζεται" : "όχι");
}

Παράδειγμα σε Kotlin (Android)

// Το deviceID ελήφθη από την ptOpen
val params = listOf(
    PtConfig(parameter = CAN_SUPPORTED, value = 0u),
    PtConfig(parameter = ISO15765_SUPPORTED, value = 0u),
    PtConfig(parameter = FD_CAN_SUPPORTED, value = 0u)
)

val result = j2534.ptIoctl(deviceID, GET_DEVICE_INFO, params.size, params.toByteArray())
if (result.status == STATUS_NOERROR) {
    val resultParams = result.toConfigList()
    Log.i("J2534", "CAN: ${if (resultParams[0].value > 0u) "ναι" else "όχι"}")
    Log.i("J2534", "ISO 15765: ${if (resultParams[1].value > 0u) "ναι" else "όχι"}")
    Log.i("J2534", "CAN FD: ${if (resultParams[2].value > 0u) "ναι" else "όχι"}")
}

Παράδειγμα σε Python

from ctypes import *

config = (SCONFIG * 3)()
config[0].Parameter = CAN_SUPPORTED
config[1].Parameter = ISO15765_SUPPORTED
config[2].Parameter = FD_CAN_SUPPORTED

config_list = SCONFIG_LIST()
config_list.NumOfParams = 3
config_list.ConfigPtr = config

ret = j2534.PassThruIoctl(device_id, GET_DEVICE_INFO, byref(config_list), None)
if ret == 0:
    print(f"CAN: {'ναι' if config[0].Value else 'όχι'}")
    print(f"ISO 15765: {'ναι' if config[1].Value else 'όχι'}")
    print(f"CAN FD: {'ναι' if config[2].Value else 'όχι'}")

Παράδειγμα σε C#

var configs = new SCONFIG[3];
configs[0].Parameter = CAN_SUPPORTED;
configs[1].Parameter = ISO15765_SUPPORTED;
configs[2].Parameter = FD_CAN_SUPPORTED;

var configList = new SCONFIG_LIST {
    NumOfParams = 3,
    ConfigPtr = configs
};

int ret = J2534.PassThruIoctl(deviceId, GET_DEVICE_INFO, ref configList, IntPtr.Zero);
if (ret == 0)
{
    Console.WriteLine($"CAN: {(configs[0].Value > 0 ? "ναι" : "όχι")}");
    Console.WriteLine($"ISO 15765: {(configs[1].Value > 0 ? "ναι" : "όχι")}");
    Console.WriteLine($"CAN FD: {(configs[2].Value > 0 ? "ναι" : "όχι")}");
}

GET_PROTOCOL_INFO — λήψη πληροφοριών πρωτοκόλλου

Παράδειγμα σε C/C++

#include "j2534_dll.hpp"

unsigned long ChannelID;  // Ελήφθη από την PassThruConnect για ISO15765
SCONFIG Config[4];
SCONFIG_LIST ConfigList;
long ret;

// Ζητάμε τα όρια του πρωτοκόλλου
Config[0].Parameter = MAX_RX_BUFFER_SIZE;
Config[1].Parameter = MAX_FLOW_CONTROL_FILTER;
Config[2].Parameter = MAX_PERIODIC_MSGS;
Config[3].Parameter = TIMESTAMP_RESOLUTION;

ConfigList.NumOfParams = 4;
ConfigList.ConfigPtr = Config;

ret = PassThruIoctl(ChannelID, GET_PROTOCOL_INFO, &ConfigList, NULL);
if (ret == STATUS_NOERROR)
{
    printf("Μέγ. μέγεθος RX buffer: %lu byte\n", Config[0].Value);
    printf("Μέγ. φίλτρα FLOW_CONTROL: %lu\n", Config[1].Value);
    printf("Μέγ. περιοδικά μηνύματα: %lu\n", Config[2].Value);
    printf("Ανάλυση timestamp: %lu µs\n", Config[3].Value);
}

Παράδειγμα σε Kotlin (Android)

// Το channelID ελήφθη από την ptConnect
val params = listOf(
    PtConfig(parameter = MAX_RX_BUFFER_SIZE, value = 0u),
    PtConfig(parameter = MAX_FLOW_CONTROL_FILTER, value = 0u),
    PtConfig(parameter = MAX_PERIODIC_MSGS, value = 0u)
)

val result = j2534.ptIoctl(channelID, GET_PROTOCOL_INFO, params.size, params.toByteArray())
if (result.status == STATUS_NOERROR) {
    val resultParams = result.toConfigList()
    Log.i("J2534", "Μέγ. RX buffer: ${resultParams[0].value} byte")
    Log.i("J2534", "Μέγ. φίλτρα FC: ${resultParams[1].value}")
    Log.i("J2534", "Μέγ. περιοδικά: ${resultParams[2].value}")
}

Παράδειγμα σε Python

from ctypes import *

config = (SCONFIG * 3)()
config[0].Parameter = MAX_RX_BUFFER_SIZE
config[1].Parameter = MAX_FLOW_CONTROL_FILTER
config[2].Parameter = MAX_PERIODIC_MSGS

config_list = SCONFIG_LIST()
config_list.NumOfParams = 3
config_list.ConfigPtr = config

ret = j2534.PassThruIoctl(channel_id, GET_PROTOCOL_INFO, byref(config_list), None)
if ret == 0:
    print(f"Μέγ. RX buffer: {config[0].Value} byte")
    print(f"Μέγ. φίλτρα FC: {config[1].Value}")
    print(f"Μέγ. περιοδικά: {config[2].Value}")

Πλήρης έλεγχος δυνατοτήτων συσκευής

Παράδειγμα σε C/C++

#include "j2534_dll.hpp"
#include <stdio.h>

void PrintDeviceCapabilities(unsigned long DeviceID)
{
    // Λίστα όλων των πρωτοκόλλων προς έλεγχο
    struct {
        unsigned long param;
        const char* name;
    } protocols[] = {
        {CAN_SUPPORTED, "CAN"},
        {ISO15765_SUPPORTED, "ISO 15765"},
        {ISO14230_SUPPORTED, "ISO 14230 (KWP2000)"},
        {ISO9141_SUPPORTED, "ISO 9141"},
        {J1850PWM_SUPPORTED, "J1850 PWM"},
        {J1850VPW_SUPPORTED, "J1850 VPW"},
        {FD_CAN_SUPPORTED, "CAN FD"},
        {FD_ISO15765_SUPPORTED, "ISO 15765 FD"},
        {TP2_0_SUPPORTED, "TP 2.0 (VAG)"},
        {J1939_SUPPORTED, "J1939"},
        {SW_CAN_SUPPORTED, "Single-Wire CAN"}
    };

    const int count = sizeof(protocols) / sizeof(protocols[0]);
    SCONFIG* config = new SCONFIG[count];
    SCONFIG_LIST configList;

    for (int i = 0; i < count; i++) {
        config[i].Parameter = protocols[i].param;
        config[i].Value = 0;
    }

    configList.NumOfParams = count;
    configList.ConfigPtr = config;

    long ret = PassThruIoctl(DeviceID, GET_DEVICE_INFO, &configList, NULL);
    if (ret == STATUS_NOERROR) {
        printf("=== Υποστηριζόμενα πρωτόκολλα ===\n");
        for (int i = 0; i < count; i++) {
            printf("%-20s: %s\n", protocols[i].name,
                   config[i].Value ? "Ναι" : "Όχι");
        }
    }

    delete[] config;
}