Обработка строк с SERIAL
- Войдите на сайт для отправки комментариев
Пт, 06/03/2020 - 12:09
Работаю с WIFI модулем, написал простенькую программу и не могу понять почему она не работает как нужно
//************************************************************************************* //Анализ пришедших данных //************************************************************************************* void analise(String data) { Serial.println(data+"3"); if (data.equals("connect_wifi") == true) { Serial.println("take password"); } if (data.equals("password") == true) { Serial.println("take login"); } if (data.equals("login") == true) { Serial.println("connecting..."); } } //************************************************************************************* //Работа программы //************************************************************************************* void loop() { //Основной цикл программы String data=""; //Таймаут //**************************** //Переменные //**************************** if(Serial.available()) { while(Serial.available()>0) { char temp=Serial.read(); if (temp == '\n') { Serial.println(data+"2"); analise(data); Serial.flush(); } else { data += temp; } } Serial.println(data+"1"); data = ""; } }
В терминале стоит (NL новая строка).
Первый раз ввожу TEST в терминале:
TE1
S1
T1
2
3
1
Второй и последующие
T1
E1
S1
T1
2
3
1
А хочу получить:
TEST2
TEST3
TEST1
Что я сделал не так?
Оставлять там эту задержку нельзя, ибо гнилой костыль, но для проверки предположения о скорости - нормально.
Данные приходят не моментально, а по одному символу. Код же ожидает, что в буфере сразу будет полная строка.
На выходе:
хм... там надо добавить одно слово и переместить одну строчку. чтоб все заработало отлично без костылей
Но вы не скажете :), я правильно понял?
Ну, сами подумайте, Вы же теперь понимаете в чём была проблема, так ведь? У Вас available показывал 0 потому, что данные не успели прийти, а Вы считали, что они уже кончились и больше не придут. Значит нужно как-то по-другому определять факт завершения передачи. Например, жёстко ждать символа '\n' столько, сколько потребуется и пока он не придёт, не дёргаться. Только не ставьте никаких делев и мёртвых циклов - это всё нужно делать неблокирующими средствами.
Основная идея заключается в постоянном чтении до обнаружения символа-терминатора строки. while там совсем не нужно.
Но вы не скажете :), я правильно понял?
скажу... только ведь ты так ничему не научишься.
На строке 27 добавить слово "static" перед String
Строчку 48 переместить на строку 39 до или после нее
После этого костыль можно убирать. Печать в строке 47 тоже уже не нужна
Но вы не скажете :), я правильно понял?
Да, мне-то нетрудно сказать. Только Вам это этого какой кайф? Моё отношение к прямым подсказкам (в т.ч. и подсказкам мне самому) я сформулировал вот в этом посте, посмотрите, если интересно.
Но если Вам пофиг, и Вы готовы в следующий раз снова по этим граблям прыгать (потому что от того, что я за Вас напишу, понимания у Вас не прибавится), то не проблема - скажите и я напишу Вам пример.
Serial.readStringUntil('\n')
Вообще полезно ознакомиться со всеми функциями, которые Serial пользует. Помогает костыли не вставлять впрограммы.
https://www.arduino.cc/reference/en/language/functions/communication/serial/
Serial.readStringUntil('\n')
Эта хрень блокирующая :(
Эта хрень блокирующая :(
Напиши неблокирующий вариант Serial, выложи библиотеку.
Напиши неблокирующий вариант Serial, выложи библиотеку.
Это заказ?
Тут уже три человека написали, как сделать неблокирующий вариант. Десять строк в библиотеку ещё оформлять, ISBN получать?
sadman41, не спугните заказчика! Я уже дополнительный карман пришивать начал.
Тут уже три человека написали, как сделать неблокирующий вариант. Десять строк в библиотеку ещё оформлять, ISBN получать?
Нет, не написали. Нет, не 10 строк.
Не написали, так не написали. Гениям - оно виднее, конечно.
Спасибо, так работает, только вот хотелось бы понять почему работает, что дало static у переменной, в доках не могу этого найти по отношению к переменной
Спасибо, так работает, только вот хотелось бы понять почему работает, что дало static у переменной, в доках не могу этого найти по отношению к переменной
так кто это должен понять - вы или я? :) Если вы - так разбирайтесь. "Не могу найти static в доках" - это откровенное вранье, в любом учебнике по С/С++ это точно есть.
Вот о чем я говорил, когда писал, что написать строчки я вам могу - но вам это не поможет. Если человек даже не может сам найти что-то типа "static in C++" в гугле - в программировании ему делать нечего...
в доках не могу этого найти по отношению к переменной
Где ж это Вы, интересно, искали? На ********.ru? Или на ********.com?
Здесь на этом сайте, в разделе "Программирование" гвоздём прибита тема: "Этюды для начинающих: Память 2. Статические переменные"
у мня неблокирующий сериал есь.
правда, надо https://github.com/DetSimen/Arduino-MessageList апчитать.
Ну, вот :-( Пропал заказ :-(
Спасибо, так работает, только вот хотелось бы понять почему работает, что дало static у переменной, в доках не могу этого найти по отношению к переменной
так кто это должен понять - вы или я? :) Если вы - так разбирайтесь. "Не могу найти static в доках" - это откровенное вранье, в любом учебнике по С/С++ это точно есть.
Вот о чем я говорил, когда писал, что написать строчки я вам могу - но вам это не поможет. Если человек даже не может сам найти что-то типа "static in C++" в гугле - в программировании ему делать нечего...
мне кажется не красиво так говорить, я программист но на php, у меня есть свой движок и несколько интернет магазинов построенных на нем, языков программирования много и они сильно отличаются, если вдруг вы этого не знаете.
Если вам хочется показать - вы все говно, а я самый умный, то зачем вы участвуете в форуме для новичков, самоутвердиться?
3d_killer,
Вы меня простите, я абсолютно ничего не имею против тех, кто не умеет программировать, но терпеть не могу, когда мне врут в глаза.
и при этом задаёте вопрос
ответ: static у переменной в С/С++ даёт ровно тоже самое, что и в PHP!
Никто ж Вас за язык не тянул, зачем Вы ляпнули про свои программистские познания? Хорошо хоть только php, а не 20 языков, как у ELITE.
ЕвгенийП, я не сильно много смотрел PHP-кода и, боюсь вас огорчить, но в нём static - что-то вроде птицы Додо.
я по этому поводу не врал, мне это не нужно, я никогда не использовал такого, поэтому и возник вопрос, мне не за чем врать, вам движок показать? сайты, или что, сам движок я не скрываю, там в основном статические классы. вот пример сайтов что я делал на своем движке:
anypool.ru
4x4ug.ru
babylotta.ru
http://xn--161-5cduqj6dl4i3a.xn--p1ai/
вся система управления построена на ajax запросах во взаимодействии с базой данных используется PDO
и я в этом вопросе самоучка, что-то не дочитал и не досмотрел и многих азов (которые мне не понадобились), могу не знать, так что вот так сразу сказать про вранье, вы наверно слишком молод, мне например 35 лет, да и врать мне нет никакого смысла, вам предоставить умнее себя (зачем мне это?), я этого не знаю не сталкивался, что попадалось то прочитал, тонкостей языка я не знаю, пытаюсь что-то постичь, но для себя, но при этом нужно деньги зарабатывать и кормить детей.
Доказательства нужны? пожалуйста мои домены rusrvic.ru share-know.ru могу там развернуть систему управления подключить итнернет магазин, CRM систему, обычный блог или лендинг сделать демо доступ, но о том о чем сейчас шла речь я понятия не имею, и в моих проектах этого просто не найти, единственное что есть в моих проектах это static какой либо класс
Я не знаю что такое птица Додо, static в пхп такой же, как везде. Ссылка на его описание есть в моём посте выше.
Я не знаю что такое птица Додо, static в пхп такой же, как везде. Ссылка на его описание есть в моём посте выше.
Ну вот, как редкий человек слышал про птицу Додо, так и редкий пхпшник слышал про статик.
так зачем тогда про вранье, не требовалось оно мне и все там работало и работает без проблем, другое дело МК, там постоянные неведомые проблемы возникают
и что такое птица додо
так зачем тогда про вранье, не требовалось оно мне и все там работало и работает без проблем, другое дело МК, там постоянные неведомые проблемы возникают
вранье было про то, что "про статик в доках ничего нет."
И насчет того, что статика нет в PHP - выглядит особенно забавно на фоне приведенного вами кода в #29. где куча модификаторов static. Если вы используете этот код втемную, не понимая как он работает и зачем в нем используются разные слова - ну значит вы и в PHP ровно такой же "программист", как и в Си...
И главное, мне соверщенно непонятно, к чему это хвастовство своими сайтами, если речь щла лишь о том, чтобы открыть учебник и прочитать полстранички? На что вы обиделись? - вы ожидали, что я вам про static лекцию прочитаю?
3d_killer, сейчас вы на чужой территории, так что остыньте. Ну, не слышали - прочитайте.
Пришёл бы я на форум по PHP и начал качать, что $_POST - какая-то непонятная херня и возмущаться, что нигде она не применяется - как бы на меня там посмотрели?
так зачем тогда про вранье, не требовалось оно мне и все там работало и работает без проблем, другое дело МК, там постоянные неведомые проблемы возникают
вранье было про то, что "про статик в доках ничего нет."
И насчет того, что статика нет в PHP - выглядит особенно забавно на фоне приведенного вами кода в #29. где куча модификаторов static. Если вы используете этот код втемную, не понимая как он работает и зачем в нем используются разные слова - ну значит вы и в PHP ровно такой же "программист", как и в Си...
И главное, мне соверщенно непонятно, к чему это хвастовство своими сайтами, если речь щла лишь о том, чтобы открыть учебник и прочитать полстранички? На что вы обиделись? - вы ожидали, что я вам про static лекцию прочитаю?
да нет конечно, лекции не нужно, там использовал потому что в синглтон классе так нужно (но зачем и почему не могу сказать), все и вся и у меня построено на кусочках знаний и прочтенных мануалах, то есть я умею много чего (разносторонние темы), но конкретно по каждой теме знаю очень мало (к сожалению), когда я обращаюсь на форум, это не пролетает у меня мимо ушей (как тут заметили), я не юзер у администратора (сам отработал администратором 9 лет), я всегда пытаюсь понять почему так, особенно если я этого не знаю.
если я чего то не могу просто никак найти, то обращаюсь на форум, ну а куда мне еще обращаться? найти другой форум? ну вот что мне делать? не понял, не нашел, не разобрался? и? тут форум для одаренных? вопросы для новичков уже не то, может надо ввести еще раздел вопросы для новорожденных?
Просто вы сильно напряжены и находитесь "в кольце врагов".
Я вот, например, не считаю зазорным поинтересоваться, что означает &&label в сях, если ранее такого не видел. Но и в бутылку не лезу с видом, что меня унижают, попрекая незнанием. Всё знать невозможно, особенно, если твоя работа - иная. Но интересоваться стоит, коли понадобилось.
так я же и интересуюсь и узнаю, спасибо что хоть что-то отвечаете, и чем то помогаете, извините все за какие то для вас глупые вопросы, но обратиться и спросить мне больше не у кого, большую часть документации я не понимаю, а вот так чтобы взять и с нуля все начать у меня не хватает времени, уже семья дети, к тому же 3-я жена, если я уж так сильно напряг своими не знаниями каких-то основ, то извиняйте, я учился на другое, но это другое нашей стране не нужно
Стариком я себя не считаю, но моя первая программа заработала за 6 лет до Вашего рождения.
Ну, тогда мы просто по-разному понимаем слово "программист".
там использовал потому что в синглтон классе так нужно (но зачем и почему не могу сказать),
...я всегда пытаюсь понять почему так, особенно если я этого не знаю.
мне кажется что у многих участников очень дофига пафоса, вот скажи мне, последний комментатор, ведь в теме ни одного полезного и бесполезного комментария от вас нет, но вот просто "пукнуть" нужно, это как бы зачем? я таких людей не понимаю.
И отвечая на этот вопрос, php я уже не занимаюсь, и теперь, немного занимаясь arduino пытаюсь во всем разобраться, что было тогда - уже в прошлом
вобщем спасибо всем откликнувшимся, сам бы я не разобрался, по моему пора прекращать эту дисскусию ни о чем, вопрос заданный в первом посте, целиком и полностью решен, еще раз благодарю.