Бьюсь над кодом по работе с OBD

damq1n
Offline
Зарегистрирован: 23.03.2015

Всем привет!

Бьюсь над кодом по работе с OBD. Взял за основу код https://github.com/kerpz/ArduinoHondaOBD/blob/master/hobd_elm/hobd_elm.ino.

Суть такая. Если читаем один параметр то все ок, а если появляется второй то работает только один, причем может поработь то один то другой, зависимость ммне не ясна.

И даже если сделать отдельную функцию для второго параметра то картина не меняется.

Ничего не понимаю.

я убрал вывод данных и лишний код.

вот само чтение:

int tmpVal = 0;
int rpmVal = 0;
int speedVal = 0;

char rxData[20];
char rxIndex=0;

char incomingbyte = '-';

void setup() 
{
  SerialUSB.begin(9600);
  Serial3.begin(38400);

}

void loop() 
{
  
//  OBD Temp
//===============================================================================

  Serial3.flush();
  
  if(Serial3.available() > 0)
  {
  incomingbyte =Serial3.read();
  }
  if (incomingbyte== '>')
  {
    Serial3.println("0105");
    getResponse();
    getResponse();
    tmpVal = (strtol(&rxData[6],0,16)-40);
  }
//===============================================================================

//  OBD RPM
//===============================================================================

  Serial3.flush();
  
  if(Serial3.available() > 0)
  {
  incomingbyte =Serial3.read();
  }
  if (incomingbyte== '>')
  {
    Serial3.println("010C");
    getResponse();
    getResponse();
    rpmVal = ((strtol(&rxData[6],0,16)*256)+strtol(&rxData[9],0,16))/4;

  }
//===============================================================================

//  OBD Speed
//===============================================================================

  Serial3.flush();
  
  if(Serial3.available() > 0)
  {
  incomingbyte =Serial3.read();
  }
  if (incomingbyte== '>')
  {
    Serial3.println("010D");
    getResponse();
    getResponse();
    speedVal = strtol(&rxData[6],0,16);

  }
//===============================================================================

}

/////////////////////////////
////// readOBD ///////
/////////////////////////////

void getResponse(void)
{
  char inChar=0;
  while(inChar != '\r')
  {
    if(Serial3.available() > 0){
      if(Serial3.peek() == '\r'){
        inChar=Serial3.read();
        rxData[rxIndex]='\0';
        rxIndex=0;
      }
      else
      {
        inChar = Serial3.read();
        rxData[rxIndex++]=inChar;
        //delay(100);
        //SerialUSB.print(inChar);
        //VGA.moveCursor(21, 19);
        //VGA.print(inChar);
        //incomingbyte ='-';
        
        
      }
    }
  }
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

если в первой части incomingbyte присвоится, то вторая и третья тоже отработает

строка 28 должна быть ниже 35ой, аналогично в оставшихся двух частях

mixail844
Offline
Зарегистрирован: 30.04.2012

не знаю особенностей чтения Serial на Arduino ,но я бы предположил что пока вы принимаете а затем обрабатываете один OBD код (например OBD Temp), "отправитель" продолжает слать следующие коды (например OBD RPM) ,а во время обработки OBD Temp вы пропускаете OBD RPM.

по хорошему прием делаеться отдельно,обработка отдельно.

+ еще есть такой момент, допустим вы обрабатываете стр 34, в это время отправитель отправил вам '>',означающий что следующая команда (OBD Temp) на подходе, то есть (тут прошу более опытных меня поправить) : "железо" байт приняло в [Rx]DataRegister а вы его в строчке 41 отчистили. и уже подходя к строке 47,там будет следующий за '>' байт.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

аппаратная часть какая вашего подключения к обд?  Такое ощущение что код не полный

damq1n
Offline
Зарегистрирован: 23.03.2015

MaksVV пишет:

аппаратная часть какая вашего подключения к обд?  Такое ощущение что код не полный

Код брал по ссылке на гитхабе, и видел где-то в примерах что люди его использовали, либо пытались. Но удалось ли им довести до рабочего состояния не уверен.

damq1n
Offline
Зарегистрирован: 23.03.2015

andycat пишет:

если в первой части incomingbyte присвоится, то вторая и третья тоже отработает

строка 28 должна быть ниже 35ой, аналогично в оставшихся двух частях

а я думал что он построчно проходит программу, а оно следуюя из ваших слов сразу отработает во всех трех частях как только incomingbyte присвоится. Понял мысль, спасибо)

damq1n
Offline
Зарегистрирован: 23.03.2015

mixail844 пишет:

не знаю особенностей чтения Serial на Arduino ,но я бы предположил что пока вы принимаете а затем обрабатываете один OBD код (например OBD Temp), "отправитель" продолжает слать следующие коды (например OBD RPM) ,а во время обработки OBD Temp вы пропускаете OBD RPM.

по хорошему прием делаеться отдельно,обработка отдельно.

+ еще есть такой момент, допустим вы обрабатываете стр 34, в это время отправитель отправил вам '>',означающий что следующая команда (OBD Temp) на подходе, то есть (тут прошу более опытных меня поправить) : "железо" байт приняло в [Rx]DataRegister а вы его в строчке 41 отчистили. и уже подходя к строке 47,там будет следующий за '>' байт.

 

угу, сложно, но понял ход мысли.

спсибо!

MaksVV
Offline
Зарегистрирован: 06.08.2015

библиотека ОБД . Подключать к ардуино меге, если хотим в Serial данные выводить (elm подключается к Serial1).  На атмеге 328 ELM подключается к Serial. Скетч: 

#include "OBD.h"

COBD obd;

uint32_t prev = 0;

int spdVal = 0;
int rpmVal = 0;
int tmpVal = 0;

void setup()
{
 Serial.begin (9600);
  obd.begin();
  //Инициализация OBD
  while (!obd.init()); 
}

void loop()
{
  if (millis()-prev>500){
  obd.readPID(PID_SPEED, spdVal);
  obd.readPID(PID_RPM, rpmVal);
  obd.readPID(PID_COOLANT_TEMP, tmpVal);
  Serial.print ("EngineSpeed = "); Serial.println (rpmVal);
  prev = millis();
                       }   
   

}  

 

damq1n
Offline
Зарегистрирован: 23.03.2015

MaksVV пишет:

библиотека ОБД . Подключать к ардуино меге, если хотим в Serial данные выводить (elm подключается к Serial1).  На атмеге 328 ELM подключается к Serial. Скетч: 

 

Я начинал, работать с этой библиотекой, выглядит просто, но вот не помню хоть убей во что-то я упёрся с этой библиотекой на DUE. Но стоит попробовать ещё раз, может ерунда там какая.

MaksVV
Offline
Зарегистрирован: 06.08.2015

купите нано и не парьтесь

damq1n
Offline
Зарегистрирован: 23.03.2015

MaksVV пишет:

купите нано и не парьтесь

мне в проекте принципиально нужна DUE, только она умеет работать с библиотекой VGA