Analyse des périphériques
Dernière modification :
La fonction recherche les adaptateurs ScanDoc disponibles et renvoie le nombre de périphériques trouvés. Cette fonction fait partie de la norme SAE J2534-1 et est destinée à la détection des périphériques avant l'appel de PassThruOpen().
long PassThruScanForDevices(unsigned long* pDeviceCount)
PassThruGetNextDevice() pour obtenir les informations sur chaque périphérique trouvé.
unsigned long, allouée par l'application. Après l'exécution réussie de la fonction, la variable contiendra le nombre de périphériques trouvés.La fonction effectue les actions suivantes :
pDeviceCountPassThruGetNextDevice()PassThruScanForDevices() → Rechercher les périphériques disponibles
↓
PassThruGetNextDevice() → Obtenir les informations de chaque périphérique (répéter N fois)
↓
PassThruOpen() → Ouvrir la connexion avec le périphérique sélectionné
↓
...
PassThruScanForDevices() n'est pas obligatoire. Si le nom du périphérique est connu à l'avance, il est possible d'appeler directement
PassThruOpen() avec les paramètres de connexion requis.
Délai d'attente de l'analyse du réseau : 2000 ms. Délai d'attente de l'analyse BLE : 3000 ms. Le temps total d'exécution de la fonction peut atteindre 5 secondes lorsque le BLE est activé.
| Code | Description | Causes possibles et solutions |
|---|---|---|
| STATUS_NOERROR | La fonction s'est exécutée avec succès | Le nombre de périphériques trouvés a été inscrit dans pDeviceCount (peut être 0) |
| ERR_NULL_PARAMETER | Le pointeur pDeviceCount n'est pas défini | Passez un pointeur valide vers une variable unsigned long |
| ERR_CONCURRENT_API_CALL | Une fonction de l'API J2534 est déjà en cours d'exécution |
|
| ERR_NOT_SUPPORTED | La fonction n'est pas prise en charge |
|
| ERR_FAILED | Erreur interne |
|
#include "j2534_dll.hpp"
unsigned long deviceCount = 0;
// Recherche des périphériques
long ret = PassThruScanForDevices(&deviceCount);
if (ret != STATUS_NOERROR)
{
char error[256];
PassThruGetLastError(error);
printf("Erreur d'analyse : %s\n", error);
return;
}
printf("Périphériques trouvés : %lu\n", deviceCount);
if (deviceCount == 0)
{
printf("Aucun périphérique trouvé\n");
return;
}
// Obtention des informations de chaque périphérique
SDEVICE deviceInfo;
for (unsigned long i = 0; i < deviceCount; i++)
{
ret = PassThruGetNextDevice(&deviceInfo);
if (ret == STATUS_NOERROR)
{
printf("Périphérique %lu : %s\n", i + 1, deviceInfo.DeviceName);
}
}
val j2534 = J2534JNI(context)
// Recherche des périphériques
val scanResult = j2534.ptScanForDevices()
if (scanResult.status == STATUS_NOERROR) {
Log.i("J2534", "Périphériques trouvés : ${scanResult.deviceCount}")
// Obtention des informations de chaque périphérique
for (i in 0 until scanResult.deviceCount) {
val deviceInfo = j2534.ptGetNextDevice()
if (deviceInfo.status == STATUS_NOERROR) {
Log.i("J2534", "Périphérique ${i + 1} : ${deviceInfo.deviceName}")
}
}
} else {
Log.e("J2534", "Erreur d'analyse : ${scanResult.status}")
}
from ctypes import *
import platform
# Chargement de la bibliothèque
if platform.system() == "Windows":
j2534 = windll.LoadLibrary("j2534sd_v05_00_x64.dll")
elif platform.system() == "Darwin":
j2534 = cdll.LoadLibrary("libj2534_v05_00.dylib")
else:
j2534 = cdll.LoadLibrary("libj2534_v05_00.so")
device_count = c_ulong()
# Recherche des périphériques
ret = j2534.PassThruScanForDevices(byref(device_count))
if ret == 0: # STATUS_NOERROR
print(f"Périphériques trouvés : {device_count.value}")
# Structure SDEVICE pour obtenir les informations du périphérique
class SDEVICE(Structure):
_fields_ = [
("DeviceName", c_char * 80),
("DeviceAvailable", c_ulong),
("DeviceDLLFWStatus", c_ulong),
("DeviceConnectMedia", c_ulong),
("DeviceConnectSpeed", c_ulong),
("DeviceSignalQuality", c_ulong),
("DeviceSignalStrength", c_ulong)
]
# Obtention des informations de chaque périphérique
for i in range(device_count.value):
device_info = SDEVICE()
ret = j2534.PassThruGetNextDevice(byref(device_info))
if ret == 0:
print(f"Périphérique {i + 1} : {device_info.DeviceName.decode()}")
else:
error = create_string_buffer(256)
j2534.PassThruGetLastError(error)
print(f"Erreur : {error.value.decode()}")
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SDEVICE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string DeviceName;
public uint DeviceAvailable;
public uint DeviceDLLFWStatus;
public uint DeviceConnectMedia;
public uint DeviceConnectSpeed;
public uint DeviceSignalQuality;
public uint DeviceSignalStrength;
}
class J2534
{
[DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int PassThruScanForDevices(out uint pDeviceCount);
[DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int PassThruGetNextDevice(out SDEVICE psDevice);
[DllImport("j2534sd_v05_00_x64.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int PassThruGetLastError(
[MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder pErrorDescription);
}
// Utilisation :
uint deviceCount;
int ret = J2534.PassThruScanForDevices(out deviceCount);
if (ret == 0) // STATUS_NOERROR
{
Console.WriteLine($"Périphériques trouvés : {deviceCount}");
for (uint i = 0; i < deviceCount; i++)
{
SDEVICE deviceInfo;
ret = J2534.PassThruGetNextDevice(out deviceInfo);
if (ret == 0)
{
Console.WriteLine($"Périphérique {i + 1} : {deviceInfo.DeviceName}");
}
}
}
else
{
var error = new System.Text.StringBuilder(256);
J2534.PassThruGetLastError(error);
Console.WriteLine($"Erreur : {error}");
}
PassThruGetNextDevice() - Obtention des informations sur les périphériques trouvésPassThruOpen() - Établissement de la connexion avec l'adaptateur