Помогите разобраться с кодом

s1981
Offline
Зарегистрирован: 22.12.2013

char str;
void setup(){
  Serial.begin(9600);
}
void loop(){
if (Serial.available()>0)
{
str=Serial.read();
  Serial.print(str);
}
if (str=="on")
{
}
}

 

Подскажите что сдесь не так? Если сравнивать с числовой переменной, то все ок. А мне нужно именно строку. Подскажите пожалуйста.?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Не принято сравнивать символ со строкой. Сравнивай символ с символом: if (str == 'o') или собирай символы в строку String, тогда можно сравнивать строки.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

str - это один символ.

А сравнивать пытаемся с "on" - т.е. со строкой из двух символов.

Даже если бы такие сравнения были допустимы, разве могут они быть равны друг другу хоть когда-нибудь?

s1981
Offline
Зарегистрирован: 22.12.2013

String s;
void setup()
{
Serial.begin(9600);
}
void loop(){
while (Serial.available())    //если есть что читать
{
char c = Serial.read();     //читаем символ
s += c;                     //добавляем к строке
if (c == '\n')              //если считали символ переноса каретки (строка закончилась)
{
Serial.print("String: "); //выводим строку
Serial.println(s);
if (s=="on"){
  Serial.println("Service On");
}
s = "";
}
}
}

 

Тогда вот так...все равно условие не выполняется.?

Помогите

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Конечно, нет.

Ну, вот допустим, Вы ввели в мониторе порта on и нажали Enter.

Что у Вас будет сравниваться? В строке s у Вас сидит "on\n". С чего это оно будет равно "on"?

Я уже не говорю, что структура программы кривая и сильно зависит от того, удастя ли прочитаь всю строку за раз или она разобьётся по разным проходам loop - в этих случаях будет работать по-разному.

И, да, кстати, посмотрите http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii и делайте как там написано.

s1981
Offline
Зарегистрирован: 22.12.2013

ЕвгенийП пишет:

Конечно, нет.

Ну, вот допустим, Вы ввели в мониторе порта on и нажали Enter.

Что у Вас будет сравниваться? В строке s у Вас сидит "on\n". С чего это оно будет равно "on"?

Я уже не говорю, что структура программы кривая и сильно зависит от того, удастя ли прочитаь всю строку за раз или она разобьётся по разным проходам loop - в этих случаях будет работать по-разному.

И, да, кстати, посмотрите http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii и делайте как там написано.

 

Уважаемый!!! помогите пожалуйста!!!!!! Я догадывался что принемает "on\n" -\n перевод строки. Дак подскажите пожалуйста как избавиться от него, что бы я мог сравнивать строки прищедшие с порта с нужными мне строками??? За ранее благодарю

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понимаю, как я могу помочь.

Вы говорите, что понимаете, что в s будет "on\n". Ну, а если понимаете, так почему Вы его сравниваете с "on", а не с "on\n"?

Как Вам тут помочь, если Вы всё понимаете, но не делаете как надо?

А по структуре программы сами смотрите. В конце Loop Вы стираете накопленное значение s. Т.е. если вся Ваша строка "on\n" придёт за раз, то всё нормально. А вот, если придёт только первый символ, а остальные с задержкой - Вы пропустите эту команду.

s1981
Offline
Зарегистрирован: 22.12.2013

ЕвгенийП пишет:

Не понимаю, как я могу помочь.

Вы говорите, что понимаете, что в s будет "on\n". Ну, а если понимаете, так почему Вы его сравниваете с "on", а не с "on\n"?

Как Вам тут помочь, если Вы всё понимаете, но не делаете как надо?

А по структуре программы сами смотрите. В конце Loop Вы стираете накопленное значение s. Т.е. если вся Ваша строка "on\n" придёт за раз, то всё нормально. А вот, если придёт только первый символ, а остальные с задержкой - Вы пропустите эту команду.

 

Умный до немогу, но обьяснить не могу.

s1981
Offline
Зарегистрирован: 22.12.2013

Нормальные люди!!!!, обьясните как убрать из полученной строки символ перевода к-ки - "/n"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если Вам нужна помощь, то делайте что Ва говорят.

1. Прменяйте наконец строку, как я писал в прошлом посте.

2. опубликуйте получившуюся программу как положено. Вот я сейчас хочу поговорить о конкретной строке, как я на неё сошлюсь? Если бы Вы опубликовали так, как я Вам написал - были бы номера трок.

3. Запустите программу и опишите, что получилось.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Попробуй так

void loop()
{
 if (Serial.available())
 {
  c = Serial.read();
  if (c == '\n')
  {
    if (s == "on")..... делаешь свои дела
    s = "";
  }
  else s += c;
 }
}

 

s1981
Offline
Зарегистрирован: 22.12.2013
String s="";

void setup(){
  Serial.begin(9600);
}
void loop(){
  if (Serial.available()>0)
  {
char c = Serial.read();     //читаем символ
s += c;                     //добавляем к строке
if (c == '\n')              //если считали символ переноса каретки (строка закончилась)
{
Serial.println(s);
if (s.substring(0,2)=="on")
{
  Serial.println("Service ON");
}
s="";
}
  }
}

Вот что мне нужно было

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ну зачем? Ну я же Вам написал - в 14-ой строке нужно просто написать

if (s=="on\n")

Никакого substring - выигрыш и по времени и по памяти.

Но это не отменяет остального. По-прежнему Вы пропускаете команду, если она придёт в сериал не целиком.

s1981
Offline
Зарегистрирован: 22.12.2013

ЕвгенийП пишет:

Блин, ну зачем? Ну я же Вам написал - в 14-ой строке нужно просто написать

if (s=="on\n")

Никакого substring - выигрыш и по времени и по памяти.

Но это не отменяет остального. По-прежнему Вы пропускаете команду, если она придёт в сериал не целиком.

Спосибо, возьму на заметку. Пока мне хватит моего варианта

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

s1981 пишет:

String s="";

void setup(){
  Serial.begin(9600);
}
void loop(){
  if (Serial.available()>0)
  {
char c = Serial.read();     //читаем символ
s += c;                     //добавляем к строке
if (c == '\n')              //если считали символ переноса каретки (строка закончилась)
{
Serial.println(s);
if (s.substring(0,2)=="on")
{
  Serial.println("Service ON");
}
s="";
}
  }
}

Вот что мне нужно было

if (c != '\n') {s += c;}                     //добавляем к строке