Официальный сайт компании Arduino по адресу arduino.cc
Бьюсь над кодом по работе с OBD
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 23/01/2019 - 15:10
Всем привет!
Бьюсь над кодом по работе с 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 ='-'; } } } }
если в первой части incomingbyte присвоится, то вторая и третья тоже отработает
строка 28 должна быть ниже 35ой, аналогично в оставшихся двух частях
не знаю особенностей чтения Serial на Arduino ,но я бы предположил что пока вы принимаете а затем обрабатываете один OBD код (например OBD Temp), "отправитель" продолжает слать следующие коды (например OBD RPM) ,а во время обработки OBD Temp вы пропускаете OBD RPM.
по хорошему прием делаеться отдельно,обработка отдельно.
+ еще есть такой момент, допустим вы обрабатываете стр 34, в это время отправитель отправил вам '>',означающий что следующая команда (OBD Temp) на подходе, то есть (тут прошу более опытных меня поправить) : "железо" байт приняло в [Rx]DataRegister а вы его в строчке 41 отчистили. и уже подходя к строке 47,там будет следующий за '>' байт.
аппаратная часть какая вашего подключения к обд? Такое ощущение что код не полный
аппаратная часть какая вашего подключения к обд? Такое ощущение что код не полный
Код брал по ссылке на гитхабе, и видел где-то в примерах что люди его использовали, либо пытались. Но удалось ли им довести до рабочего состояния не уверен.
если в первой части incomingbyte присвоится, то вторая и третья тоже отработает
строка 28 должна быть ниже 35ой, аналогично в оставшихся двух частях
а я думал что он построчно проходит программу, а оно следуюя из ваших слов сразу отработает во всех трех частях как только incomingbyte присвоится. Понял мысль, спасибо)
не знаю особенностей чтения Serial на Arduino ,но я бы предположил что пока вы принимаете а затем обрабатываете один OBD код (например OBD Temp), "отправитель" продолжает слать следующие коды (например OBD RPM) ,а во время обработки OBD Temp вы пропускаете OBD RPM.
по хорошему прием делаеться отдельно,обработка отдельно.
+ еще есть такой момент, допустим вы обрабатываете стр 34, в это время отправитель отправил вам '>',означающий что следующая команда (OBD Temp) на подходе, то есть (тут прошу более опытных меня поправить) : "железо" байт приняло в [Rx]DataRegister а вы его в строчке 41 отчистили. и уже подходя к строке 47,там будет следующий за '>' байт.
угу, сложно, но понял ход мысли.
спсибо!
библиотека ОБД . Подключать к ардуино меге, если хотим в Serial данные выводить (elm подключается к Serial1). На атмеге 328 ELM подключается к Serial. Скетч:
библиотека ОБД . Подключать к ардуино меге, если хотим в Serial данные выводить (elm подключается к Serial1). На атмеге 328 ELM подключается к Serial. Скетч:
Я начинал, работать с этой библиотекой, выглядит просто, но вот не помню хоть убей во что-то я упёрся с этой библиотекой на DUE. Но стоит попробовать ещё раз, может ерунда там какая.
купите нано и не парьтесь
купите нано и не парьтесь
мне в проекте принципиально нужна DUE, только она умеет работать с библиотекой VGA