Serial.print пропускает или зависает внутри инструкции "if". Попытка вызвать функцию ЧЕРЕЗ последовательный uart

У меня есть два микроконтроллера, которые общаются друг с другом с помощью последовательных контактов UART.

Теперь по какой-то причине, которую я не могу понять, почему ... выполнение Serial.print() не работает в операторе "if". А также присвоение / объявление / инициализация переменных и значений внутри оператора "if" не работает ... это действительно странно. Я могу включить контакты GPIO в операторе "if", но кроме этого больше ничего не работает.

Это микроконтроллеры: Arduino Nano и WeMos D1 Mini.

Просто хочу отметить, что оба микроконтроллера нормально взаимодействуют друг с другом, и arduino может определить последовательный вход, но он не может использовать "Serial.print" в операторе "if" в "strcmp", он пропускается.

РЕДАКТИРОВАТЬ: я только что проснулся сегодня утром, и волшебным образом "Serial.print" работает правильно внутри инструкции "if" "strcmp"... Я предполагаю, что микроконтроллер нуждался в некотором отдыхе, я тестировал его более 13 часов...

Пожалуйста, ознакомьтесь с приведенным ниже кодом:

    void setup()
    {
      Serial.begin(9600);   
    }
    
    void loop() 
    {
      char a[5];
      delay(100);
      int i = 0;
    
      if (Serial.available() > 0)      
      {
        while(Serial.available() > 0)
        {
            a[i]=Serial.read(); 
            i++;
        }
        
        a[i] = '\0';  //последний символ, вставленный с "нулевым символом".
      }
    
     if(strcmp(a,"RGB_1") == 0)   //<----- " оператор if", сравнивающий буфер массива строк
     {
        int m = 1; //<---------------- объявление и инициализация переменной
        //Serial.print(m); //<-------- Последовательный монитор зависнет и пропустит приведенные ниже контакты GPIO для запуска.
        digitalWrite(12, HIGH);
        delay(1000);
        Serial.print(m); //<---------- " оператор if" позволяет выводам GPIO запускаться, но пропускает эту последовательную печать.
     }
   }

, 👍1

Обсуждение

выведите значение i, @jsotola


1 ответ


5

С высокой вероятностью вы превышаете свой массив символов, см.:

char a[5];

Который может содержать 5 символов. Однако вы пишете:

if(strcmp(a,"RGB_1") == 0)

Который предполагает, что вы получаете "RGB_1", который состоит из 6 символов, потому что строка заканчивается на 0.

Что также может случиться, так это то, что вы действительно получаете только 5 символов без конечной новой строки, что означает, что strcmp продолжает поиск до тех пор, пока не найдет конец строки, чего может и не произойти.

Таким образом, вы можете несколько увеличить размер массива только для целей тестирования и вывести i, как предлагает jsotola. Кроме того, также выведите каждый символ, который вы вводите в массив, чтобы вы знали, как / если обрабатывать новую строку.

Если вы не получили конец строки, то используйте вместо функции strcmp, затем используйте strncmp, который может искать ровно 5 символов, не проверяя до конца строки.

,

@S-To: Номер. a[5] содержит 5 значений с индексом от 0 до 4., @ocrdu

@ Michel Keijzers Спасибо за быстрый комментарий., @S To

@ocrdu Да, ты прав, виноват.... только что у меня был мозговой пердеж., @S To