Проблемы с подключением Bluetooth OBD2 ELM327

Я сделал небольшой проект, используя Arduino UNO, 3,5-дюймовый дисплей, модуль bluetooth HC-05 и ELM327 (дешевый клон ebay). Мне удалось установить связь, прочитать данные, интерпретировать и отобразить их, но только остается одна проблема, которая продолжает беспокоить меня.

После некоторого обмена данными между Arduino и адаптером OBD2 связь просто обрывается. Я не знаю, это от HC-05 или ELM327. Насколько я смог отладить, данные от ELM327 приходят неполные. Обычно ответ от него, преобразованный в символы, выглядит как «0103141 03 02 00 >», и я использую символ «>» в программе, поскольку обмен данными завершен. Когда возникает проблема, я получаю меньше байтов от адаптера OBD и без символа «>», что-то вроде «0103141 03».

Я создал функцию, которая сбрасывает модуль HC-05 и повторно подключается, но это занимает несколько секунд, и я хочу, чтобы мои данные поступали непрерывным потоком.

Я испробовал несколько методов отладки, таких как изменение скорости передачи данных HC-05 и добавление некоторых задержек, но так и не нашел решения.

Я считаю, что проблема может заключаться в одном из этих трех:

  1. Дешевый клон ebay все портит.
  2. HC-05 не отправляет полные данные.
  3. Проблема с моим кодом.

Ниже я прикрепил часть кода, которая выполняет отправку команды и чтение ответа. Когда возникает проблема, она застревает в цикле while, потому что у меня нет завершающего символа ">", и я должен сломать его, вызвать другую функцию, которая восстанавливает связь, и так далее.

Итак, мой вопрос: кто-нибудь сталкивался с этой проблемой, когда ELM327 отправляет неполные данные, которые нельзя использовать?

 BTSerial.println("010F1");
 BTSerial.flush();
 delay(10);
  if (BTSerial.available()>0)
      busy = true;
  while(busy = true && inData != 62)
  { 
      temp++;
      if (temp>500000){
          resetBT();
          BTSerial.println("ATWS");
          break;
      }
      if (BTSerial.available()>0){
          inData=0;
          inData = BTSerial.read();
          if(inData != 32) {
              buf[i] = inData;
              Serial.print(char(buf[i]));
              i++;
          }

      }

  }
Serial.println();
busy=false;
inData = 0;
i = 0;
memset(buf, 0, sizeof(buf));
temp = 0;

, 👍0

Обсуждение

сократите свой код до минимума ..... удалите весь цикл while и просто выгрузите полученные данные в окно терминала .... проанализируйте данные .... может быть что-то, что вы упускаете из виду ... .. опубликуйте данные в своем вопросе, если их не слишком много .... может быть, можно найти какой-то шаблон, @jsotola


2 ответа


1

Мне удалось решить проблему. После еще нескольких тестов я обнаружил, что проблема заключалась в обмене данными через модуль Bluetooth HC-05. Я изменил его с библиотеки SoftwareSerial на основной последовательный COM-порт, и с тех пор у меня не было проблем. Я не знаю, как эта библиотека могла вызвать проблему, но это было так.

,

1

Вы можете гораздо проще связать Arduino с ELM327 в программном обеспечении с библиотекой ELMduino.h. Его можно загрузить через среду разработки Arduino IDE, и он содержит примеры.

,