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 запускаться, но пропускает эту последовательную печать.
}
}
@S To, 👍1
Обсуждение1 ответ
С высокой вероятностью вы превышаете свой массив символов, см.:
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
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Использование последовательных контактов TX/ RX для связи по USB
- Проблема последовательной связи с общей землей SIM800L
- Потеря данных при последовательном считывании с помощью Arduino Nano
- Путаница в чтении Oscope Software Serial Arduino
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как использовать Serial.setTimeout()
выведите значение
i
, @jsotola