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

Тема в разделе "Arduino & Shields", создана пользователем TiMoN816, 20 дек 2022.

  1. TiMoN816

    TiMoN816 Нерд

    Доброго времени суток уважаемые форумчане.
    Обо всем по порядку:
    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() {
    [B]Serial2.write("0105\r"); //Проблема в этом месте[/B]
      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);
        }
    [B]Serial2.print("010C\r"); //Проблема в этом месте[/B]
      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
     
  2. TiMoN816

    TiMoN816 Нерд

    Вопрос решен.