ARDUINO Ожидание ответа после команды

Timon816

✩✩✩✩✩✩✩
13 Май 2022
2
0
Доброго времени суток уважаемые форумчане.
Обо всем по порядку:
1) Код писал сам, не копировал (еще учусь и разбираюсь).
2) Данный код предназначен для Ардуино Мега .
3) Ардуино Мега подключается к адаптеру ELM327, а сам ELM327 в разъем OBD2 авто.
4) Схема подключения, все просто
ELM327---------Мега
RX----------------TX2
TX----------------RX2
GND-------------GND
5) Данный код принимает ответ от ELM327, обрабатывает и вывод в порт полученное значение.
6) Если отправлять запрос в ручную, код рабочий.

И сам вопрос: имеются команды от Мега к ELM327 - "0105\r" и "010C\r", ответы на них, допустим "00 00 1B\r>" и "00 00 11 1B\r>" соответственно. В скетче имеется 2 строки с отправкой этих команд (выделены), но беда в том, что не могу разобраться, как написать код так, чтобы после загрузки МК была отправлена первая команда "0105\r" далее Мега дождалась ответа от ELM327, обработала его, вывела ответ в порт и только потом перешла ко второй команде "010C\r" сделав все тоже самое что и с первой, и вновь перешла к отправке первой команды. Пробовал писать применив flag, но почему-то Мега все равно постоянно шлет запросы. Друзья, помогите пожалуйста решить задачку.:)

C++:
void setup() {
Serial.begin(38400);
Serial2.begin(38400);
Serial.setTimeout(10);
delay(2000);
}
void loop() {
Serial2.write("0105\r"); //Проблема в этом месте
  if(Serial2.available() >0 ){
    char data[20] = "";
    int www = Serial2.readBytesUntil('>',data, 20);
    data[www] = NULL;
    char cstr[20] = "";
    strcat(cstr, data);
    char s1 = cstr[6];
    char s2 = cstr[7]; 
    int n1 = s1-'0';
    int n2 = s2-'0';
    switch(n1){ case 17: n1=10; break;
                case 18: n1=11; break;
                case 19: n1=12; break;
                case 20: n1=13; break;
                case 21: n1=14; break;
                case 22: n1=15; break;
                defaul1: n1=n1; }
    switch(n2){ case 17: n2=10; break;
                case 18: n2=11; break;
                case 19: n2=12; break;
                case 20: n2=13; break;
                case 21: n2=14; break;
                case 22: n2=15; break;
                defaul2: n2=n2; }
  
    int n3 = (n1*16 + n2*1)-40;
    Serial.println(n3);
    }
Serial2.print("010C\r"); //Проблема в этом месте
  if(Serial2.available() > 0 ){
    char data[20] = "";
    int www = Serial2.readBytesUntil('>',data, 20);
    data[www] = NULL;
    char cstr[20] = "";
    strcat(cstr, data);
    char s1 = cstr[6];
    char s2 = cstr[7];
    char s3 = cstr[9];
    char s4 = cstr[10];
    int n1 = s1-'0';
    int n2 = s2-'0';
    int n3 = s3-'0';
    int n4 = s4-'0';
    switch(n1){ case 17: n1=10; break;
                case 18: n1=11; break;
                case 19: n1=12; break;
                case 20: n1=13; break;
                case 21: n1=14; break;
                case 22: n1=15; break;
                defaul3: n1=n1; }
    switch(n2){ case 17: n2=10; break;
                case 18: n2=11; break;
                case 19: n2=12; break;
                case 20: n2=13; break;
                case 21: n2=14; break;
                case 22: n2=15; break;
                defaul4: n2=n2; }
    switch(n3){ case 17: n3=10; break;
                case 18: n3=11; break;
                case 19: n3=12; break;
                case 20: n3=13; break;
                case 21: n3=14; break;
                case 22: n3=15; break;
                defaul5: n3=n3; }
    switch(n4){ case 17: n4=10; break;
                case 18: n4=11; break;
                case 19: n4=12; break;
                case 20: n4=13; break;
                case 21: n4=14; break;
                case 22: n4=15; break;
                defaul6: n4=n4; }
    int q1 = (n1*16)+(n2*1);
    int q2 = (n3*16)+(n4*1);
    int ob = ((q1*256)+q2)/4;
    Serial.println(ob);
    }
} // Void Loop
 
Изменено: