Очень простая операция Arduino Uno Serial.readString()
Я новичок в программировании Arduino. Я пытаюсь идентифицировать входную строку с последовательного монитора и соответственно вывести вывод на консоль
Код:
void setup() {
Serial.begin(9600);
}
void loop() {
while (Serial.available() > 0 ) {
String str = Serial.readString();
if (str.equals("send")) {
Serial.println("identified");
} else {
Serial.println("unknown");
}
}
}
Всякий раз, когда я помещаю строку отправки, она показывает "неизвестно" в качестве вывода, что неверно, и я должен получить "идентификацию" в качестве вывода. Может ли кто-нибудь направить меня сюда, чтобы добиться результата.
Примечание. Я получаю вывод, как и хотел, с помощью функции readStringUntil, но в строках много "." в нем, следовательно, бесполезно.
@KarmaCoding, 👍4
Обсуждение3 ответа
Лучший ответ:
Если вы установите строку последовательного монитора, заканчивающуюся на "Both NL & CR", тогда этот код найдет слово "отправить". Он НЕ найдет слово "отправить" в этой строке, "ssend" или в этой строке, "sendd".
void setup(){
Serial.begin(9600);
}
void loop(){
while(Serial.available() > 0 ){
String str = Serial.readString();
if(str.substring(0) == "send\r\n"){
Serial.println("identified");}
else{
Serial.println("unknown");
}
}
}
Если вы хотите найти строку "send" в "1234send", "send1234" или "1234send5678", используйте indexOf();
void setup(){
Serial.begin(9600);
}
void loop(){
while(Serial.available() > 0 ){
String str = Serial.readString();
if(str.indexOf("send") > -1){
Serial.println("identified");}
else{
Serial.println("unknown");
}
}
}
Существует множество причин, по которым проверка *.equals неверна. Учитывайте разницу в регистре или дополнительные символы, введенные из источника ваших сообщений. Даже непечатаемые символы могут создать проблемы и привести к сбою теста.
Рассмотрите возможность использования вместо этого *.substring(). Этот метод вернет true, если подстрока будет найдена. Например:
String stringOne = "12345 send 1234";
// substring(index) ищет подстроку от позиции индекса до конца:
if (stringOne.substring(0) == "send")
{
Serial.println("identified");
}
else
{
Serial.println("unknown");
}
...должно всегда возвращать значение "identified", поскольку символы 's', 'e', 'n' и 'd' находятся в правильной последовательности в строке stringOne.
Строка ул = Serial.readString(); если (str.substring(0) == "отправить") Serial.println («идентифицировано»); еще Serial.println ("неизвестно"); это даже не сработало., @KarmaCoding
Странный. Вы смотрели ссылку на веб-страницу, чтобы убедиться, что правильно используете подстроку? ([Эта веб-страница?](https://www.arduino.cc/en/Tutorial/StringSubstring)). Кроме того, из комментариев я вижу, что вы распечатали полученную строку и увидели «отправить» в полученном сообщении, верно? Вы можете просто закомментировать строку последовательного чтения и попробовать использовать "String str = "12345 send 1234";" проверить, все ли работает. Судя по другим комментариям, вы можете быстро попробовать отправить (ввести) «пробел» + «отправить» + «пробел» («отправить»), чтобы увидеть, работает ли это., @st2000
Это не сработает. substring(n) просто возвращает часть строки, начинающуюся с позиции n. Итак, substring(0) просто возвращает копию строки. str.substring(0,4) вернет первые 4 символа строки (при условии, что будет возвращено не менее 4 символов - я недостаточно знаком с этой реализацией, чтобы знать, что она делает для более короткой строки - С# выдаст исключение)., @dwilliss
void setup() {
Serial.begin(9600);
}
void loop() {
char inChar[5];
if(Serial.available() > 0 )
{
for (int i=0; i<5; i++)
{
inChar[i] = Serial.read();
delay(10);
}
if (inChar[0] == 's' && inChar[1] == 'e' \
&& inChar[2] == 'n' \
&& inChar[3] == 'd')
{
Serial.println("identified");
}
else
{
Serial.println("unknown");
}
}
}
Чтение строки «отправить» с помощью команды Serial.readString() в порядке. Но как-то не получится, если использовать результат для сравнения (например, data == "send"...). Возможным решением является использование массива символов (например, inChar[5]). Размер массива на 1 больше, чем максимальное количество необходимых символов., @Ron Lim
- Из string в int, проблема
- Как преобразовать строку в шестнадцатеричный массив
- Использование индекса для поиска нескольких символов
- Ардуино - Извлечение нескольких строк из последовательного чтения
- Отправлять строки через SPI в обе стороны, используя два Arduino UNO (ведущий к ведомому и ведомый к ведущему)
- Команда через последовательный монитор не работает должным образом в Arduino
- Объединить данные Serial, разделенные новыми строками?
- Как разделить входящую строку?
какова ваша настройка конца строки в Serial Monitor?, @Juraj
как НЛ, так и ЧР., @KarmaCoding
затем проверьте "отправить/r/n", @Juraj
отправить/r/n не работает., @KarmaCoding
затем распечатайте его, чтобы увидеть. с печатью, а не с печатью, @Juraj
а настройка скорости передачи данных в Serial Monitor составляет 9600 бод?, @Juraj
я добавил Serial.print(str); ниже readString , в последовательном мониторе отображается правильная строка, что бы я ни печатал, но результатов все равно нет., @KarmaCoding
Давайте [продолжим это обсуждение в чате](http://chat.stackexchange.com/rooms/71045/discussion-between-karmacoding-and-juraj)., @KarmaCoding
Вы имеете в виду
\r\n
, а не/r/n
..., @Majenko@Majenko: тоже пробовал. хотя результата нет., @KarmaCoding
Проблема с использованием таких вещей, как readString, заключается в том, что вы действительно не знаете, что они делают или как они работают. Анализируйте входящие данные вручную, чтобы знать, с чем вы работаете., @Majenko