Este Programa Se Utiliza para Leer El Puerto OBD ISO 9141

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 5

/ **

   Este programa se utiliza para leer el puerto OBD ISO 9141-2 en un vehículo.

   Leerá los Códigos de diagnóstico de problemas (DTC) almacenados que figuran en

   la computadora del vehículo y mostrárselas al usuario.

   Se utiliza un software UART para comunicarse con el vehículo. Eso

   requiere algunos componentes de hardware externos para operar en

   Línea K bidireccional utilizada en ISO 9141-2. El hardware de Arduino

   UART se utiliza para enviar los DTC almacenados como texto ASCII al usuario.

*/

// NOTA: snprintf_P y PSTR se usan mucho juntos en este programa.

// La combinación permite usar una función snprintf con un

// cadena de argumento que se almacena en la memoria FLASH sin usar

// valioso espacio SRAM.

// Use memoria FLASH para almacenar cadenas en lugar de SRAM

#include <avr / pgmspace.h>

// (Software USART) AltSoftSerial se utiliza porque puede manejar velocidades de transmisión


no estándar

#include <AltSoftSerial.h>

// (Temporizador de software) Se usa para mantener viva la conexión

#include <RBD_Timer.h>

// # define LED_BUILTIN 13

// Debe usar los mismos pines UART de AltSoftSerial

#define rxPin 8

#define txPin 9

AltSoftSerial softSerial; // Utiliza Tx = 9, Rx = 8

 
// El número máximo de ECU que se leerán (determina cuánta RAM se usará)

#define MAX_RESPONSES 15

// Mantenga una lista de PID compatibles a nivel mundial. Se admite un PID específico si

// cualquier ECU conectada al sistema admite el PID.

// Almacenado en orden de bits inverso

// p.ej. PID 0x01 = bit 32, PID 0x02 = bit 31, ... PID 0x20 = bit 1

// Por ahora solo almacena 0x20 PID a la vez

// TODO: Almacene todos los PID a la vez si podemos encontrar espacio en SRAM

uint32_t gPidSupport = 0;

// Un búfer para contener todas las respuestas a cualquier mensaje de solicitud

// Los mensajes de respuesta son siempre de 11 bytes o menos:

// Encabezado1, Encabezado2, Encabezado3 (Fuente), Datos (hasta 7 bytes), Suma de


verificación

uint8_t responseBuffer [MAX_RESPONSES] [11] = {0};

// Un búfer para contener cadenas que se mostrarán al usuario a través de UART

#definir BUFLEN 64

// TODO: cambie a uint8_t una vez que podamos encontrar una alternativa a Serial.println
(buffer)

// Prueba Serial.println ((char *) buffer)

buffer de char [BUFLEN] = {0};

// Se utiliza para enviar una solicitud de 'ping' cada pocos segundos para mantener viva la
conexión

RBD :: Temporizador timerKeepAlive;

 
/*

   Enviar la secuencia de inicialización de 5 baudios para abrir las comunicaciones

*/

void send5BaudInit () {

  // ISO 9141-2 utiliza una inicialización de 5 baudios

  // Ni los UART de hardware ni de software pueden transmitir a 5 baudios,

  // así que debemos golpear la secuencia init al puerto OBD.

  pinMode (txPin, OUTPUT); // Establece el txPin en inactivo ALTO

  digitalWrite (txPin, HIGH);

  // LED indicador

  digitalWrite (LED_BUILTIN, ALTO);

  retraso (2000); // Deje Tx HIGH durante 2 segundos antes de comenzar la rutina de inicio real

  Serial.println (F ("Iniciando el inicio"));

  // Enviar 0x33 (LSB primero) a través de K-Line al puerto OBD (0x33 es la dirección del OBD)

  digitalWrite (txPin, LOW); // bit de inicio

  digitalWrite (LED_BUILTIN, BAJO);

  retraso (200); // 5 baudios significa 200 ms por bit

  digitalWrite (txPin, HIGH); // 11

  digitalWrite (LED_BUILTIN, ALTO);

  retraso (400);

  digitalWrite (txPin, LOW); // 00

  digitalWrite (LED_BUILTIN, BAJO);

  retraso (400);

  digitalWrite (txPin, HIGH); // 11

  digitalWrite (LED_BUILTIN, ALTO);

  retraso (400);

  digitalWrite (txPin, LOW); // 00

  digitalWrite (LED_BUILTIN, BAJO);

  retraso (400);
  digitalWrite (txPin, HIGH); // parada poco

  digitalWrite (LED_BUILTIN, ALTO);

  retraso (200);

  // Tenemos (min) 60 ms para configurar nuestro puerto serie antes de

  // ECU comienza a enviar el byte SYNC (0x55)

  // Establecer la velocidad en baudios para el software UART definido por ISO 9141-2 (10.4
Kbaudios)

  softSerial.begin (10400);

  // El resto del tiempo es un horrible desastre de sentencias if anidadas

  // ¿Deberíamos haber usado el temido 'goto'?

  // ¿Deberíamos haber refactorizado en funciones más pequeñas para un segmento de tiempo
tan simple?

  // No lo sé.

  // Solo trata de no perderte en la jungla de si / más abajo ...

  bool bInitError = falso; // Si hay un error, establezca bInitError en verdadero

  String strError = ""; // y almacena la descripción del error en strError.

  bool iso9141 = falso; // Será ISO 9141 o ISO 14230

  // Espera el byte SYNC (0x55)

  uint8_t sync;

  if (! getSoftSerial (sync, 300)) {

    //DEPURAR

    snprintf_P (búfer, BUFLEN, PSTR ("SYNC Byte:% 2X"), sincronización);

    Serial.println (buffer);

    // Continuar con Init si tenemos el byte SYNC correcto

    if (sincronización == 0x55) {

      uint8_t clave1;
      uint8_t clave2;

      uint8_t invKey2;

      uint8_t invAddress;

      // Obtener clave1

      if (! getSoftSerial (clave1, 20)) {

        // Obtener clave2

        if (! getSoftSerial (key2, 20)) {

          //DEPURAR

          snprintf_P (buffer, BUFLEN, PSTR ("KEY1:% X KEY2:% X"), key1, key2);

          Serial.println (buffer);

          retraso (25); // 25ms <= W4 <= 50ms (Tiempo entre la recepción finalizada de la clave2 y
el inicio del envío de la clave invertida2)

          //DEPURAR

          invKey2 = ~ key2;

          snprintf_P (buffer, BUFLEN, PSTR ("Enviando ~ KEY2:% X"), i

También podría gustarte