Проблема с считыванием данных с ELM327

Рейтинг: 1Ответов: 1Опубликовано: 16.06.2023

Возможно данный вопрос здесь будет не по теме, но я уже не знаю что делать с возникшей проблемой. Бросать на пол пути не хочется.

Идея заключалась в создании блютуз устройства на ардуино для считывания данных с машины(ELM327 v2.1) используя блютуз модуль HC-05.

В данном коде происходит перевод блютуз модуля в режим MASTER и подключение к ELM327 используя его MAC адрес. Ответы модуля в коде в комментариях.

#include <SoftwareSerial.h>
SoftwareSerial bluetoothSerial(4, 5);

void setup() {
  Serial.begin(9600);
  Serial.print("Готов)");
  bluetoothSerial.begin(38400);
  delay(1000);
  getSetAtCommand("AT");                         //OK
  getSetAtCommand("AT+CMODE=0");                 //OK
  getSetAtCommand("AT+PSWD=1234");               //OK
  getSetAtCommand("AT+ROLE=1");                  //OK
  getSetAtCommand("AT+BIND=0010,CC,4F3603");     //OK
  getSetAtCommand("AT+LINK=0010,CC,4F3603");     //OK
  delay(1000);
  getSetAtCommand("AT+STATE?");  // OK: CONNECTED
}

char buffer[50];
int i = 0;

void loop() {
  while (Serial.available() > 0) {
    char c = Serial.read();
    if (c != '\n' && i < 49) {
      buffer[i++] = c;
    } else {
      buffer[i] = '\0';
      //Serial.println(buffer);
      getSetAtCommand(buffer);
      i = 0;
    }
  }
}

void getSetAtCommand(String command) {
  Serial.println(command);
  String added_command = command + "\r\n";
  bluetoothSerial.print(added_command);
  delay(500);
  while (bluetoothSerial.available()) {
    Serial.write(bluetoothSerial.read());
  }
}

Так как State возвращает CONNECTED, предполагаю что он подключился к ELM.

На команду AT+PAIR=0010,CC,4F3603,20\r\n модуль ничего не отвечает. На команды такие как ATZ\r\n, AT015B\r\n, 015B\r\n, ATRV\r\n, 0105\r\n, at i\r\n, at rv\r\n, ati\r\n, atrv\r\n модуль также ничего не отвечает. Бывает иногда отвечает ERROR[0], как понял это означает что такой команды нет.

Мне кажется что эти команды до ELM вообще не доходят. В чём может быть проблема?

Сама ELM327 работает, к телефону подключается без проблем и показывает данные.

Пробовал через симулятор на ноутбуке, подключенный блютуз модель отображается в устройствах блютуз на ноуте и так же не работает как с ELM. Самая первая версия кода:

#include <SoftwareSerial.h>
SoftwareSerial bluetoothSerial(4, 5);

void setup() {
  Serial.begin(9600);
  Serial.print("Готов)");
  bluetoothSerial.begin(38400);
  delay(1000);
  getSetAtCommand("AT");                         //OK
  getSetAtCommand("AT+CMODE=0");                 //OK
  getSetAtCommand("AT+PSWD=1234");               //OK
  getSetAtCommand("AT+ROLE=1");                  //OK
  getSetAtCommand("AT+BIND=0010,CC,4F3603");     //OK
  getSetAtCommand("AT+LINK=0010,CC,4F3603");     //OK
  delay(1000);
  getSetAtCommand("AT+STATE?");  // OK: CONNECTED
  delay(1000);
  getSetAtCommand("ATZ");      //нет ответа                 
  getSetAtCommand("AT015B");//нет ответа
  getSetAtCommand("015B");             //нет ответа           
  getSetAtCommand("ATRV");//нет ответа
  getSetAtCommand("0105");    //нет ответа                   
  getSetAtCommand("at i");//нет ответа
  getSetAtCommand("at rv");   //нет ответа                    
  getSetAtCommand("ati");//нет ответа
  getSetAtCommand("atrv");//нет ответа
}

void loop() {
}

void getSetAtCommand(String command) {
  Serial.println(command);
  String added_command = command + "\r\n";
  bluetoothSerial.print(added_command);
  delay(500);
  while (bluetoothSerial.available()) {
    Serial.write(bluetoothSerial.read());
  }
}
Serial.print("atsp5 )");
bluetoothSerial.print("atsp5\r\n");
delay(1000);
while (bluetoothSerial.available()) {
  Serial.write(bluetoothSerial.read());
}

Ответы

▲ 1Принят

У вас Bluetooth-модуль управляется посредством AT-команд, и ELM тоже управляется ими же. Поэтому нужно чётко различать, кому предназначена та или иная команда. При включении устройства вы переводите Bluetooth-модуль в режим конфигурирования кнопкой. С этого момента он начинает слушать поступающие AT-команды и обрабатывать их. Подключённым устройствам он ничего не передаёт.

Как только вы закончили конфигурирование Bluetooth-модуля и установили соединение с подключённым устройством, необходимо перевести Bluetooth-модуль в обычный режим, для того, чтобы он перестал обрабатывать поступающие команды, и начал пересылать их подключённому устройству. Для этого выполните после AT+LINK команду AT+RESET.