Работа со строкой(String)

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Всем доброго времени суток. Решил по практиковаться на Ардунке и придумал сделать RGB лампочку которая управляется по слову (Green,Blue,Red и т.д). Но программа работает не так-как бы мне хотелось!

String Color; //Цвет
void setup() {
  Serial.begin(9600);
  }

void loop() {
  if(Serial.available() > 0){
    Color = Serial.readString();// считываем инфу с порта
Serial.println(Color);
if(Color == "green" || "Green"){
 Serial.println("Green"); 
}
if(Color == "red" || "Red"){
 Serial.println("Red"); 
}
if(Color == "blue" || "Blue"){
 Serial.println("Blue"); 
}
  }
  }

Если в порт попадает любая информация она воспринемается как "Истинное", тоесть все условия логических операторов if исполняются по порядку. А это не то что я хотел, поэтому я открыт к вашим замечяниям и предолжениям.

 
kalapanga
Offline
Зарегистрирован: 23.10.2016

if(Color == "green" || Color == "Green")

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Мне аж стыдно стало... Спасибо !!!

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

А ежели сдуру всё прописными буквами введёте? Типа капс нажат? Не проще ли в строке №8 написать

Color = Serial.readString().toLowerCase();  // считываем инфу с порта

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

b707
Offline
Зарегистрирован: 26.05.2017

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

А ежели сдуру всё прописными буквами введёте? Типа капс нажат? Не проще ли в строке №8 написать .toLowerCase() и после этого уже не париться, и всегда сравнивать только со словами, записанными только строчными буквами.

А можно вообще не париться регистром - ни входных строк, ни парметров сравнения - а просто использовать функцию strcasecmp()

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

b707 пишет:
strcasecmp()
Ни пужайте навечка ниприличными славами!!!

Класс String - наше фсё!!! Ничто другое так скетч не угробит! :)))

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Евгений, ну зачем же так на String? Она проста и понятна, а когда памяти не будет хватать человек освоит char* char[] и иже с ним :-)

Ну так то да, я сейчас пытаюсь от String отказаться это как серпом по бубенцам :-)

 

b707
Offline
Зарегистрирован: 26.05.2017

Andrey12 пишет:

 

Ну так то да, я сейчас пытаюсь от String отказаться это как серпом по бубенцам :-)

 

Если сразу не пользоваться String - и отказываться не придется.

И зачем вообще начинать?  Чем String так хорош? - в моих скетчах его нет

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

b707 пишет:

Если сразу не пользоваться String - и отказываться не придется.
И зачем вообще начинать?  Чем String так хорош? - в моих скетчах его нет

Согласен, Но это как с ручки на автомат пересаживаться, просто привычка. Я вот поезжу на ручке дня 4, потом на автомате постоянно но переключалку хватаюсь и сцепление ищу :-)
Тут так же, новичку со Stirng проще так как все собранно в одном классе, и сравнение и поиск и копирование и преобразование, не надо искать массу функций типа strlen() strcpy() strcat() и тд.

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Извеняюсь но ваш вариант не очень хорошо работает

Вот такая ошибка всплывает "exit status 1 no match for 'operator=' (operand types are 'String' and 'void')"

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

MsFedkin пишет:

Извеняюсь но ваш вариант не очень хорошо работает

Вот такая ошибка всплывает "exit status 1 no match for 'operator=' (operand types are 'String' and 'void')"

Во, блин, а он и впрямь void возвращает! Обкурились, когда писали :))) Ну, запишите с void, какая разница

Color = Serial.readString();  // считываем инфу с порта
Color.toLowerCase();

 

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

Andrey12 пишет:
я сейчас пытаюсь от String отказаться

Зачем? Я вот не отказываюсь, когда это адекватно ситуации, то пользуюсь за милую душу.

Другое дело, это сложный объект и надо уметь им польхзоваться и понимать что реально стоит за теми или иными операциями, а новички часто думают, что в сказку попали :)

Я вообще не считаю нужным от чего-либо отказываться (настоящие мужчины не стесняются использовать goto!!!). Есть ящик с инструментами и, если из него что-то выкинуть, возможности по работе от этого, ну никак не увеличатся.

Logik
Offline
Зарегистрирован: 05.08.2014

А вот char* - совсем простой обект, помнить всякой хни не надо достаточно стандартных функций, он адекватный в любой ситуации. И возможности при его использовании увеличиваются, ЕвгенийП фигню пишет. Например те две строки в #10 у стринга потребуют несколько циклов прохода по строке символов, а при работе с char* и прием с сириала и преобразование легко делается в одном цикле.

ПС. Идея ТС хранить цвета строками в стринге - бред бухой сивой кобылы упавшей с луны на кактус. Запомните, никогда так не делайте, даже если сильно угрожать или пытать будут.

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

Logic, фигню пишете Вы. Всякий инструмент полезен, когда его применяют по назначению и правильно. Если Вы с этим не согласны, и считаете, что какие-то инструменты нужно просто выбросить .... ну, это не первая глупость, которую я от Вас читаю.

Logik
Offline
Зарегистрирован: 05.08.2014

Хватит флудить, по сути пишите. Вечный срач разводите. Не строки кода, ни проект, хотя пардонте, есть тут одна строка ваша, только компилится с ошибкой. Вам и каменный топор видать полезен, а мы уж както без него.

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

Вот так-то лучше. Пожалуйста и впредь придерживайтесь той же линии.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

гы! Логик, на 8-ми ядерном компе с 16гигами ОЗУ вы тоже не станете, как я понимаю - из принципа, пользоваться чем-то 4ого поколения (на выбор: perl, ruby, python, c#), а станете писать на "честном С"? Даже какой-нить интерфейс к ком порту, клаве и MySQL, так? ;) ;) ;)

===============

Ничего личного, просто троллю.

Честно говоря, что матмодель какого-нить DDS генератора я , конечно, напишу на Питоне и нарисую даже не в PyQT, а в простом TKinter. Вот ни за каким хером тут не нужен С++. Оно и так по отжатию работает.

если не стоит задача экономии ресурсов, то String - это хорошо, Python или Perl - это тоже хорошо.

Но ведь  у вас на все есть особое "нот со хамбл опиньон"?

Logik
Offline
Зарегистрирован: 05.08.2014

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

Вот так-то лучше. Пожалуйста и впредь придерживайтесь той же линии.

Я рад что вам лучше, это ремисия, так бывает при маразме.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

wdrakula пишет:

Но ведь  у вас на все есть

неистребимое желание устроить срач.

Logik
Offline
Зарегистрирован: 05.08.2014

wdrakula пишет:

гы! Логик, на 8-ми ядерном компе с 16гигами ОЗУ вы тоже не станете, как я понимаю - из принципа, пользоваться чем-то 4ого поколения (на выбор: perl, ruby, python, c#), а станете писать на "честном С"? 

Пришел с работы где и писал на С/С++. Сегодня под OpenWRT, ядер  - много ;) Платят хороше. Скорость всем нужна, даже там, где вы и не подозреваете о проблеме. Думаю вы пользовались по жизни написаным мной (ну так 50/50 если есть авто и в крупном городе живете то наверняка). Глюки и тормозню от применения классов аналогичных стрингу чистил лично. Еще вопросы есть? Спрашывайте. Я Всегда по умолчанию пишу о чем знаю, кроме случаев когда явно это указываю.

//Честно говоря, что матмодель какого-нить DDS генератора я , конечно, напишу на Питоне

А я в екселе напишу, так и чего с того.

Задача экономии ресурсов никогда не стоит в начале проекта, она ближе к концу возникает, когда позно менять уже. Потому умные люди соломку стелят, стринг не юзают, пишут бережливо к памяти и производительности. Оно потом выручает.

ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Logik пишет:

ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?

извиняюсь но немогли бы вы разъяснить это высказывание.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

MsFedkin пишет:

извиняюсь но немогли бы вы разъяснить это высказывание.

Не бери в голову, это он "в порядке общего срача" умность свою показывает. Пинает он не тебя, а Влада и Евгения (у него комплекс такой - он им (себе?) всё время свою крутизну доказать пытается), ты просто случайно рядом оказался.

Logik
Offline
Зарегистрирован: 05.08.2014

MsFedkin пишет:

Logik пишет:

ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?

извиняюсь но немогли бы вы разъяснить это высказывание.

А чего тут не ясно. В вашем коде плохо все, начиная от способа передачи информации о цвете в канале связи. Почему строки? Закодируйте его удобным для МК способом, байтом например, а чтоб Вам было проще, так байт 'R' пусть красный и т.д. Это снимет кучу проблем, о большинстве которых Вы пока не подозреваете, потерю синхронизации приема и передачи например.  Ну допустим это от Вас не зависит, надо именно строки,хотя в домашних проектах это редкость. Тогда зачем их хранить? Задайте требуемые строки массивом констант. Ну приняли первый байт, проверили первый символ в строках из массива, по нему уже ясно какой из 3-х вариантов сообщения может быть. Сохраните индекс строки в которой совпадает первый символ в переменной byte C и дальше просто проверяйте соответствие каждого последующего принятого символа с требуемым. Если вдруг какой не совпал, например приняли "Blяe", значить у Вас проблема, фиксируете этот факт в флаге или просто С=-1. И соответствено уже ничего не выводите. Если же прошли до конца строки успешно (кстати подумайте чем завершатся строки) то пишите if(C==0) Serial.println("Red");  if(C==1) Serial.println("Green");... Это и даст основной существенный выиграш, сравнение С==1 для МК в 100-1000 раз проще и быстрей чем Color=="Red".   Кстати в канале может прийти и "Blяяяe" и "Gr", а немного позже "een"  (или концевка не прийдет вобще) прочая непредвиденая чепуха, и это тоже надо обрабатыва както, чтоб оно не сбивало последующий прием. Потому передача одним байтом в вашем случае оберегает от кучи проблем, как я уже писал. Потому надо в корне менять, тогда и String не понадобится вобще. А к нему лучше не привікать, выше люди писали о этом.


arduino328
Offline
Зарегистрирован: 01.09.2016

Logik пишет:

MsFedkin пишет:

Logik пишет:

ПС. Вы вобще тему с начала прочитайте, там ТС цвет в стринге названием кодирует, это в каком поколении так надо?

извиняюсь но немогли бы вы разъяснить это высказывание.

тогда и String не понадобится вобще. А к нему лучше не привікать

Ну нравятся ему стринги (вместо семейных трусов) :)

По делу: разумеется проще (и правильнее) кодировать цвет одной буквой (R G B), а ещё лучше цифрой - не надо будет при проверке регистр букв учитывать.

MsFedkin
Offline
Зарегистрирован: 12.12.2017

Я уже кодировал цвет и через parceInt и через char, и вот решил дойти до string. В самом начале я написал что решил пропактиковаться так-как с портом ардуино и со стрингом я имею мало опыта работы и как уже говорил решил пропрактиковаться. 

Насчет передачи байта, я знаю про такой способ и собираюсь опрбывать его на выходных с ИК приёмником.

И спасибо что расказали что у String есть такие проблемы, а то бы и дальше им пользовался.

 

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

MsFedkin пишет:

И спасибо что расказали что у String есть такие проблемы

Это только начало, мы Вам можем и про проблемы других типов рассказать. Вообще ничем пользоваться не будете :))))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Про проблеммы String поясню:

Проблема в том, что стринг занимает и освобождает память безсистемно.Чтов итоге приведет к нехватке памяти или порче стека.

Притаких незначительных ресурсах,как в arduino uno, nano  и т.п. не следует учиться и привыкать использовать стринг.

Тут глупая ситуация - безопасно использовать стринг может лишь тот программист, которому этот самый стринг, по большому счету, не нужен.

Новичку можно поиграться в стринг и бросить. Даже простая сигналка с приемом и отправкой СМС уже упирается в нехватку памяти, если не научиться работатьс С-строками, как полагается.

Но стоит вам взять контроллер помощнее, где памяти побольше, и тот же Стринг сократит время разработки.А хороший компилятор нормально все оптимизирует. Прогресс не стоит на месте!

======================

Вот например я - "умею" ;) рисовать прямые и дуги - вообще без операций с плавающей точкой и даже без умножений. В 90-е годы мне была нужна быстрая графика на EGA и VGA машинах без сопроцессора. На кой хер теперь нужны эти знания? Железо на котором это актуально - ну разве что дисплей к ардуинке! :) На котором не бывает задач, критичных к времени вывода на экран.

arduino328
Offline
Зарегистрирован: 01.09.2016

wdrakula пишет:

Вот например я - "умею" ;) рисовать прямые и дуги - вообще без операций с плавающей точкой и даже без умножений. В 90-е годы мне была нужна быстрая графика на EGA и VGA машинах без сопроцессора. На кой хер теперь нужны эти знания? Железо на котором это актуально - ну разве что дисплей к ардуинке! :) На котором не бывает задач, критичных к времени вывода на экран.

Ну как не бывает, осциллографы на Ардуинке же делают.

В виде этюда можно выложить код: чего ему зря пылиться, может кому и пригодится (почти стихи).

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

wdrakula пишет:
безопасно использовать стринг может лишь тот программист, которому этот самый стринг, по большому счету, не нужен.
Более чёткая формулировка того, что я пытался сказать в посте #11.

Logik
Offline
Зарегистрирован: 05.08.2014

wdrakula пишет:

Тут глупая ситуация - безопасно использовать стринг может лишь тот программист, которому этот самый стринг, по большому счету, не нужен.

Да, мало того что не нужен, он еще и немного мешать будет. Потому такое к нему отнощение. Получается новичку вредит, а метру - минимум не нужен. Оч "полезная" штуковина.

wdrakula пишет:

Вот например я - "умею" ;) рисовать прямые и дуги - вообще без операций с плавающей точкой и даже без умножений. В 90-е годы мне была нужна быстрая графика на EGA и VGA машинах без сопроцессора. На кой хер теперь нужны эти знания? Железо на котором это актуально - ну разве что дисплей к ардуинке! :) 

Не прибедняйтесь.  Везде где нет плавающей точки, а это посути все кроме компа, так и выводят. Другое дело что дуги вобще мало где нужны. Везде bmp или jpg. Вы представляете декодирование jpg реализованое на чистом perl или пыхе без использования реализаций соответствующего алгоритма на других (догадываетесь каких;) языках? В том и дело что высокоуровневые плотно сидят на реализованом на с/с++ и их успех целиком зависит от наличия нужной реализации. Если нет тех самых знаний упакованых в компилированый код - приплыли. Си без перла обойдется (много лет обходится), а вот перл без си - нет.

wdrakula пишет:

 дисплей к ардуинке! :) На котором не бывает задач, критичных к времени вывода на экран.

Нее! А осцилограф забабахать, или спектр прорисовать. Есть задачи требующие скорость на экране, пусть не 25FPS, ну хоть 8-10. Да даже интерфейс оконный прорисовать в приятном темпе востребовано но несколько проблемно. 

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Вы представляете декодирование jpg реализованое на чистом perl или пыхе без использования реализаций соответствующего алгоритма на других (догадываетесь каких;) языках? В том и дело что высокоуровневые плотно сидят на реализованом на с/с++ и их успех целиком зависит от наличия нужной реализации. Если нет тех самых знаний упакованых в компилированый код - приплыли. Си без перла обойдется (много лет обходится), а вот перл без си - нет.

Логик, я писал декодирование и потоковую обработку векторной графики (бинарных файлов) на чистом Перле. С нуля, так как в то время (97 - 2000) нужных мне библиотек для работы с графикой в перле еще не было. Организовывал структуры,  собирал их в ветвящиеся связанные списки, сортировал - нормально это все делается в перле, кстати. Очень похоже на Си. Проект был вполне рабочим, с его помощью было обработано несколько десятков тысяч векторных диаграмм.

Потом, лет через пять - без проблем портировал на Си, когда понадобилось. Но изначально все на Перле было. Так что не надо наезжать на Перл, он и без Си многое может :)

Logik
Offline
Зарегистрирован: 05.08.2014

Так векторная и на бейсике пишется, там обем данных на один примитив мизерный, координаты точек, да индекс примитива. А отрисовку наверняка использовали готовую, и не на перле писаную.  Векторная далеко не jpg. В компанию к jpg можна mp3 и mpeg4 добавить. Их тоже можна на перле с пыхой играть. Но в реале там будет крутится код написаный на с/с++. Так что все это 4-е поколение сводится к оболочке над написаным ранее производительным кодом на с/с++. Для упрощения пользования малоквалифицироваными разработчиками и снижения времени разработки.