Al crear la aplicación, nos enfrentamos a muchas opciones, problemas, etc., con los que trataremos de familiarizarlo en este artículo. Al final resultó que, puede tener un diálogo con el coche, y bastante productivo. Naturalmente, para organizar la comunicación con el automóvil, debe "establecer contacto", "hacer la pregunta correcta" y comprender correctamente la "respuesta" recibida del automóvil. En consecuencia, el artículo tendrá como objetivo explicar la organización del diálogo en un idioma accesible, así como decirle qué errores puede encontrar en el camino y cómo lidiar con ellos.
Elección de conexión
Inicialmente, es necesario aclarar que se utilizará un adaptador ELM327 para conectarse al automóvil. ELM327 es un microcircuito que le permite convertir los protocolos utilizados en los neumáticos de diagnóstico de automóviles en el protocolo RS232, al que transferiremos los datos. Debido al hecho de que la transmisión de datos a través del protocolo RS232 ocurre secuencialmente, surge el primer problema: la velocidad de transferencia de datos, que trataremos de eludir en uno de los siguientes párrafos.
Existen varias variaciones del adaptador ELM327, que se clasifican según el método de transferencia de datos: Bluetooth, WIFI, USB. Dado que el objetivo de desarrollo es un dispositivo móvil con Android, puede elegir las dos versiones más adecuadas de ELM327, como Bluetooth y WIFI. Dado que solo hay una forma de recibir y procesar datos, y solo difieren en las opciones de conexión al adaptador, puede elegir solo una, organizar un diálogo con ella y luego agregar las opciones de conexión restantes.
ELM327 1.5 vs ELM327 2.1

Uno de los primeros problemas que pudo encontrar fue el problema de elegir el adaptador directamente, en nuestro caso Bluetooth. Resulta que si necesita admitir todos (al menos la mayoría) de los automóviles, debe elegir la versión v1.5 en lugar de la v2.1, que de hecho debe aclararse varias veces al comprar un adaptador, porque los vendedores intentan entregar la versión del adaptador no para el que es de hecho, porque No son particularmente diferentes. De hecho, en la versión v2.1 no hay soporte para los protocolos J1850 PWM y J1850 VPW, lo que significa que no podrá conectarse a automóviles que usen estos protocolos.
Conexión
La conexión al adaptador se realiza en varias etapas:
- Conexión a un adaptador (Bluetooth, WIFI)
- Envío de comandos de inicialización (cadena de inicialización)
Si todo está claro con la organización de la conexión. El principio de funcionamiento es el mismo que con cualquier chat Bluetooth / WIFI. Para comprender cómo enviar la cadena de inicialización, es necesario estudiar qué comandos existen, así como qué funciones realizan.
AT Z [restablecer todo]
Restablezca la configuración del adaptador a los valores predeterminados de fábrica.
AT L1-0Habilitar / deshabilitar saltos de línea.
AT E1-0Eco encendido - apagado
AT H1-0Encabezados activados - desactivados
AT AT0-1-2Adaptive Timing Off - Adaptive Timing Auto1 - Adaptive Timing Auto2
AT ST FFEstablecer el tiempo de espera al máximo.
AT D [establecer todo en Predeterminado]
Restablezca la configuración al estado inicial configurado por el usuario.
AT DP [Describa el protocolo actual]
El escáner puede determinar independientemente el protocolo del vehículo al que está conectado.
AT IB10 [establezca la velocidad de
transmisión ISO en 10400]
El comando establece la velocidad en baudios para ISO 9141-2 y
ISO 14230-4 10400
AT IB96 [establezca la velocidad de transmisión ISO en 9600]
El comando establece la velocidad en baudios para ISO 9141-2 y
ISO 14230-4 9600 para protocolos 3,4,5.
AT SP h [Establecer protocolo h]
El comando de selección de protocolo h, donde h:
0: automático;
1 - SAE J1850 PWM (41,6 Kbaudios);
2 - SAE J1850 VPW (10,4 Kbaudios);
3 - ISO 9141-2 (5 baudios de inicio, 10.4 Kbaudios);
4 - ISO 14230-4 KWP (5 baudios init, 10.4 Kbaudios);
5 - ISO 14230-4 KWP (inicio rápido, 10.4 Kbaud);
6 - ISO 15765-4 CAN (ID de 11 bits, 500 Kbaudios);
7 - ISO 15765-4 CAN (ID de 29 bits, 500 Kbaudios);
8 - ISO 15765-4 CAN (ID de 11 bits, 250 Kbaud);
9 - ISO 15765-4 CAN (ID de 29 bits, 250 Kbaudios);
AT SP Ah [Establecer protocolo h con Auto]
El comando establece el protocolo predeterminado h, si la conexión que usa el protocolo h falla, entonces el adaptador inicia la selección automática del protocolo.
En base a los comandos descritos anteriormente, formamos la cadena de inicialización.
initializeCommands = Arrays.asList("ATZ", "ATL0", "ATE1", "ATH1", "ATAT1", "ATSTFF", "ATDP", "ATSP0");
Es aconsejable permitir que el usuario cambie los comandos de inicialización, porque para seleccionar la "clave" para algunos automóviles, es necesario elegir configuraciones de adaptadores más adecuadas. En nuestro caso, se utilizan configuraciones adecuadas para la mayoría de los protocolos estándar.
También es aconsejable prestar atención al comando APSP0, por lo que establecemos la selección automática de protocolo predeterminada, esto puede llevar algún tiempo.
En consecuencia, si el usuario sabe cuál es su protocolo automático, entonces, utilizando la capacidad de cambiar el protocolo de conexión, puede cambiar 0 a su número de protocolo.
Leer datos de diagnóstico
Los comandos especiales de PID se utilizan para leer datos de diagnóstico.
PID (ID de parámetro: identificadores de parámetros de diagnóstico a bordo): códigos que se utilizan para consultar el rendimiento de sensores específicos del vehículo.
Los pids principales se pueden encontrar en Wikipedia, hay un conjunto completo de comandos básicos que todos los autos deberían admitir. También hay conjuntos de comandos para ciertas marcas y tipos de automóviles, estos conjuntos se proporcionan por una tarifa. En nuestro caso, la aplicación se centra en el diagnóstico básico de automóviles, respectivamente, utilizamos el conjunto básico de comandos.
También es posible recibir datos actuales del automóvil, mientras que el comando para recibir datos del automóvil tendrá
01 al principio, lo que indica que queremos obtener datos reales. Si queremos obtener los datos guardados del automóvil, al principio del comando debe especificar
02 . Por ejemplo, el comando para obtener la velocidad actual del automóvil es
010D , y para obtener la velocidad guardada -
020D .
Si observa cuidadosamente la cantidad de comandos que proporcionan los recursos abiertos, puede notar el problema sobre el que escribí al principio, es decir, el problema de la velocidad de respuesta del adaptador. Dado que enviar y recibir comandos es secuencial, para recibir las lecturas del sensor en el momento actual, es necesario esperar una respuesta a todos los comandos anteriores. En consecuencia, si solicita recibir todos los comandos, existe una alta probabilidad de que la actualización de datos reales ocurra muy lentamente. Pero este problema se puede resolver si usa los comandos que muestran solo los equipos que existen en el automóvil. Por ejemplo:
0100 - PID compatibles [01 - 20]
0120 - PID compatibles [21 - 40]
0140 - PID compatibles [41 - 60]
0160 - PID admitidos [61 - 80]
0180 - PID compatibles [81 - A0]
01A0 - PID compatibles [A1 - C0]
Demostraré cómo determinar qué sensores están presentes en el automóvil usando uno de los pids. Por ejemplo:
- 0100 \\ solicitud
- BB1E3211 \\ respuesta del auto
Traducimos la respuesta del auto a un sistema de números binarios
BB1E3211(16) > 10111011000111100011001000010001(2)
Usando la siguiente placa podemos determinar qué pids son compatibles con nuestro automóvil, comenzando del 01 al 20:

En base a los datos obtenidos, podemos determinar que nuestro automóvil admite las siguientes opciones:
01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20
Ahora, en lugar de enviar a los 32 equipos y esperar una respuesta para ellos, a pesar del hecho de que algunos pueden estar ausentes, usaremos solo 15 equipos. Pero este no es el límite de la llamada optimización. Para que los datos se actualicen aún más rápido, le aconsejo que solicite solo datos sobre esos sensores que se muestran en la pantalla. Aunque esto limita algunas funcionalidades de la aplicación. Por ejemplo, un registro histórico.
Leer y decodificar errores del automóvil
Los errores del automóvil también pueden ser diferentes y existen comandos separados para ellos también. Por ejemplo:
- 03 - Para mostrar códigos de error guardados
- 0A: para mostrar códigos de error persistentes.
Al igual que con otros comandos, los errores del automóvil vienen en forma codificada, respectivamente, como en otros comandos, deben decodificarse para obtener la información necesaria. Déjame darte un ejemplo de cómo funciona la decodificación de errores. Código:
private final static char[] dtcLetters = {'P', 'C', 'B', 'U'}; private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); private void performCalculations(String fault) { final String result = fault; String workingData = ""; int startIndex = 0; troubleCodesArray.clear(); try { if (result.contains("43")) { workingData = result.replaceAll("^43|[\r\n]43|[\r\n]", ""); } else if (result.contains("47")) { workingData = result.replaceAll("^47|[\r\n]47|[\r\n]", ""); } for(int begin=startIndex; begin < workingData.length(); begin += 4) { String dtc = ""; byte b1 = Utility.hexStringToByteArray(workingData.charAt(begin)); int ch1 = ((b1 & 0xC0) >> 6); int ch2 = ((b1 & 0x30) >> 4); dtc += dtcLetters[ch1]; dtc += hexArray[ch2]; dtc += workingData.substring(begin + 1, begin + 4); if (dtc.equals("P0000")) { continue; } troubleCodesArray.add(dtc); } } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } }
Y ahora para la explicación.
En función de la respuesta recibida, podemos obtener un código de error, para esto decodificamos el mensaje recibido utilizando las siguientes placas.
Primer personaje:

Segundo personaje:

Se forman 3, 4, 5 caracteres de acuerdo con esta tabla:

En base a esto, podemos intentar analizar la siguiente respuesta 0001000000111110

Código de error: P103E
Epílogo
En esta etapa, descubrimos cómo organizar un diálogo con el adaptador, enviarle comandos, recibir y descifrar sus respuestas. Esta es una gran parte del trabajo, si considera cuánto tiempo lleva estudiar el material, pero al mismo tiempo es bastante interesante. Fuera de este artículo, hay muchos problemas asociados con la interfaz visual, así como muchas funciones adicionales, como agregar nuevos pids desde un archivo, una forma estándar y avanzada de conectarse al adaptador y crear gráficos.
Matvienko Alexander, Hossein Fakhr.