Последовательная связь, если инструкция не работает
#include <SoftwareSerial.h>
SoftwareSerial my (D6,D7); //(Rx,Tx)
String msg;
void setup() {
Serial.begin(115200);
my.begin(9600);
}
void gas()
{
Serial.println(msg);
if (msg == "0")
{
Serial.println("Gas Leakage !!");
}
if(msg == "1") {
delay(1);
}
}
void loop() {
msg = my.readStringUntil('\n');
gas();
}
//Я использую Serial программного обеспечения для обмена данными с Arduino UNO на NodeMCU, я получаю данные правильно, но условие "условие оператора if" с ним не работает. как заставить оператор if работать?
@Syed Abubakar, 👍0
Обсуждение1 ответ
Вы используете Serial.println()
для отправки сообщения. Эта функция добавит комбинацию \r\n
в качестве окончания строки к вашему сообщению, которая представляет собой коды ASCII для возврата каретки и новой строки.
В вашем коде получения вы читаете до \n
, поэтому ваше сообщение теперь читается как "0\r"
, что, конечно, не равно "0"
. Таким образом, условие if никогда не сработает.
При использовании msg[0] == '0'
вы берете первый символ из строки и сравниваете его с символом '0'
(особенно обратите внимание разница между "0"
, который является строкой, и '0'
, который является одним символом). Поскольку вы используете только первый символ строки, \r
не учитывается; вы его не используете.
Что теперь делать?
Вы можете отправить сообщение только с символом
\n
в конце строки. Для этого используйте толькоSerial.print()
вместоSerial.println()
и добавьте строкуSerial.print("\n");
сразу после отправки сообщения.Вы можете написать свой собственный код для чтения до тех пор, пока не удалите все вхождения символа
\r
.Вы можете использовать
msg.trim()
для удаления любых пробелов в начале или конце строки, включая\r
в конце . Затем вы можете использовать код, который вы уже написали.
Обратите внимание, что использование String
на Arduino чаще всего считается злом. Особенно, если вы хотите использовать код в течение более длительного периода времени или используете String
очень часто. Память для String
выделяется динамически, что может легко привести к фрагментации кучи. Для лучшего и более подробного объяснения посмотрите злые строки Arduino, запись в блоге Маженко, который является одним из наших крупнейших участников здесь.
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- Повреждение данных SoftwareSerial - поиск предложений
- Какой лучший способ объявить Serial при создании библиотеки Arduino?
- Термопринтер Adafruit печатает слабо
- Последовательная связь между nodemcu и Arduino Uno
- Получение мусорных значений при отправке объекта Json из Arduino Uno в NodeMCU с использованием SoftwareSerial
- SoftwareSerial мешает TVout
- Проблема последовательного подключения Uno к NodeMCU
Возможно, у вас также есть
\ r
в вашей строке. Как именно вы отправляете сообщение?, @chrislмоя проблема решена путем замены if (msg == "0") на if (msg[0] == '0') , но я не знаю почему?, @Syed Abubakar
Я бы предположил именно ту причину, которую я указал выше, @chrisl
что означает этот терминатор \r\n? в последовательной связи?, @Syed Abubakar
Пожалуйста, ответьте на вопрос, как именно вы отправляете сообщение. Тогда я напишу правильный ответ на ваш вопрос. Вы используете
Serial.println()
? Или вы пересылаете данные из Serial Monitor, установленного на оба конца строки?, @chrislда, я использую Serial.println(), @Syed Abubakar
https://www.arduino.cc/reference/en/language/functions/communication/serial/println/, @Juraj