Раcчленить String

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Мужики, добрый вечер! Всю башку сломал - не выходит каменый цветок. Дружу мегу с жпрс-шилдом таким кодом:

String s="";
 
void setup()
{
  Serial.begin(19200);
  Serial3.begin(19200);
}
 
void loop()
{
  while (Serial3.available()) {
   char c=Serial3.read();
   s+=c; }
    
Serial.print(s);
    s="";
}

Получаю при звонке на модем строку вида:


RING

+CLIP: "+79171234567",145,"",,"",0

Все прекрасно. Теперь хочу с помощью substring'а вытащить из нее , к примеру, слово "RING", теоретически подозревая, что перед ним подряд идут скорее всего символы (порядок не важен) "\n\0\r"... Пишу код:

String s="";
 
void setup()
{
  Serial.begin(19200);
  Serial3.begin(19200);
}
 
void loop()
{
  while (Serial3.available()) {
   char c=Serial3.read();
   s+=c; 
  }
 if (s.substring(0, 4)=="RING")  Serial.print("RING0"); 
 
 if (s.substring(1, 5)=="RING")  Serial.print("RING1"); 
 
 if (s.substring(2, 6)=="RING")  Serial.print("RING2"); 
 
 if (s.substring(3, 7)=="RING")  Serial.print("RING3"); 
 
  if (s.substring(4, 8)=="RING")  Serial.print("RING4"); 
  
    s="";
}

Но получаю молчание в Serial... Где прогон?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
Andrey-S
Offline
Зарегистрирован: 02.01.2015

Все классно, кроме того, что нифига не понятно. Я вот отсюда слизал: https://www.arduino.cc/en/Tutorial/StringSubstring И помнится мне, раньше это все работало примерно с тем же кодом, а сейчас никак не въеду в трабл...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вытащить из нее , к примеру, слово "RING"
на то есть функция , я не kisoft - вспомню-подскажу :)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

вытащить из нее , к примеру, слово "RING"
на то есть функция , я не kisoft - вспомню-подскажу :)

Конечно есть - substring например)... Но ни она, ни startsWith, ни endsWith не хотят работать...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не то это :(  , отпуск......
не надо использовать String !

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

не то это :(  , отпуск......
не надо использовать String !


Ну есть у него минусы, но для меня они не критичным, а вот плюсы крайне удобны))

Maverik
Offline
Зарегистрирован: 12.09.2012

в цикле while поставьте переменную счетчик i++ и выводите её в Serial вместе с переменной с

скорее всего в Serial сыпется еще какой-то мусор из возвратов каретки и т.д., и не факт что их всего четыре, а ваш substring ищет значение RING в фиксированных положениях строки.  почитайте про Serial.available(), там могут быть просто необработанные символы с предыдущего запроса. Попробуйте поставить Serial.flush() перед обращением к порту.

я как раз в такой ситуации вместо substring писал собственную функцию, которая обрабатывает входящий поток, выискивая оттуда нужную подстроку.

 

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

Андрей, ну неужели религия не позволяет поставить после строки 14 вывод переменной s в сериал и просто посмотреть что и с чем Сравниваете? Просто посмотреть! Какого хрена вы все вслепую работаете?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

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

Андрей, ну неужели религия не позволяет поставить после строки 14 вывод переменной s в сериал и просто посмотреть что и с чем Сравниваете? Просто посмотреть! Какого хрена вы все вслепую работаете?


Я может чего не догнал, но в первом коде вроде так и есть...

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

Andrey-S пишет:
Я может чего не догнал, но в первом коде вроде так и есть...
Так первый код Вас же устраивает. У Вас проблема в третьем коде! Так и ставьте печать в третьем, чтобы проблему увидеть.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Дык получаю тоже самое тогда что и во втором коде))).. А правильно будет в третьем коде после 14 строки написать допустим String X=s.substring(0, 10); и затем печатать X?

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

А что, целикон нельзя напечатать? Ну, печатайте хоть так.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

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

А что, целикон нельзя напечатать? Ну, печатайте хоть так.


Целиком если печатать, то выходит точь-в-точь второй код... Тобишь как будто все логично и все правильно, но substring не работает... Я конечно могу распарсить строку методом отлавливания символов конца строки и прочей ерунды, но это нагромождает код мне кажется, но если вы посоветуете делать именно так, то я брошу идею с сабстрингом ибо лучше сделать как знающие говорят!)

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

Андрей, наш диалог длится уже несколько часов. А ведь всё, что я Вам сказал - ну, напечатайте Вы, наконец что и с чем Вы сравниваете и посмотрите!!!! Просто перед сравнением напечатайте то, что сравниваете. Трудно поставить печать после строки 14, а перед каждым if поставить печать соответсвующей substring (из этого if)??? Просто сделайте это! И посмотрите, что увидите. Не поймёте, выкладывайте свежий код и лог печати, вместе смотреть будем. Нафига вслепую работать? 

Maverik
Offline
Зарегистрирован: 12.09.2012

да ладно там вывод на сериал.  пусть сделает хотябы Serial.flush();  

art100
Offline
Зарегистрирован: 09.03.2014

Раcчленить String = получим Short -ы А вы тут Серийный.Вратель(блин)-Серийный.Вратель(блин)-Serial.write(blin);

Десяток постов в ветке программирование прочитал ничего не понял. Одни истерики ЕвгенияП. Евгений давай рюмашку ликерчика дзинь. :) 

Конченные автоматы с потерей совместимости.

Лень примеры в компиляторе полистать.

и т.д. и т.п.

 

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

Ликерчик?!?! Обижать изволите, барин. Я русский человек, а Вы мне ... ликёрчику ... тьфу! :)

art100
Offline
Зарегистрирован: 09.03.2014

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

Ликерчик?!?! Обижать изволите, барин. Я русский человек, а Вы мне ... ликёрчику ... тьфу! :)

Не помню откуда это но что-то уж больно классичесое. Я с автором не согласен. Избаловамши жидкостями мы. Покрнейше прошу извинить меня сударь.

ЦеДваАшОАшПять я давно стаканом не пью и АшДваОАш не запиваю каждые 30 минут для получения СорокаОдного Градуса для лучшего сног сшибания. Мой организм зная этот составчик очень быстро реагирует и отправляет пугать унитаз. Короче я пил всякого пил разного. Искушал разных жидкостей. Когда-то во всю дверь туалета был плакат с сотней видов пива. Когда я отдегустировал более 50% того что на плакате собрано начались проблемы с поиском приличного пива. Очень вам не советую из пластмасовой бутылки пить, а уж если не втерпежь употреблять надо пока яды с пластика в пиво не поперли в течении суток. Потому женой приготовленный ликерчиком смаковать люблю. 

Вот из местных форумных архивов. Густой сладкий темный как кровь. Мозги после него работают а ходить и вставать сос тула не хочеться. :) У жены ликерчик получаются по разному. Иногда как портвейн крепкий иногда как сироп разбавленный. Рецепта не знаю. Знаю что чернополдную рябину жена на даче собирает. Сахар точно. Водка точно. Делает очень быстро. И вуаля. Муж уже никуда не уходит. А огурки какие класные готовит. Вах. Вах. Пальчики оближешь. Поэтому как ни крути string-и если делить быстро превращаются в short-ы. Все завист от того чтобы стек не переполнялся мусором. И тогда divide over flow тебе не страшен. А то смотрю перполняет твой стек. Прогамма твоя выходит за предели пользовательского пространства и попадает в облясть ядра. Поэтому надо для снижения темепратуры понизить или частоту прочтения дури ленивых или скорость процессора отвечающего на внешние раздражители. :)

 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Вообщем не стал я лишний раз раздражать всех лишним кодом с постоянным выводом в сериал после всяческих манипуляций... Но метод научного тыка никто не отменял и вставив в первый код в цикл while после 13ой строки "delay(3)", сразу все поперло как часы... (delay(1) и delay(2) подглючивали, постоянно изменяя показания в substring'е, а вот delay(3) и более сразу стабилизировал показания). О херня какая... 

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

Andrey-S пишет:

Вообщем не стал я лишний раз раздражать всех лишним кодом с постоянным выводом в сериал после всяческих манипуляций...

Совершенно напрасно. Это самый действенный способ отладки. То же, что Вы сделали "тыком" - замаскировали проблему, не поняв её сути А коль скоро причина не понята, проблема не решена, а только спрятана. Завтра вылезет что-нибудь ещё. Вам лень напечатать значения? Ну, воюйте дальше.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Отнюдь! Могу Вам выложить хоть весь километр кода, а также все его модификации ибо ценю, что Вы тратите на меня хоть минутное, но время). То, что я "замаскировал" проблему - это же тоже некая полезная информация в процесс ее понимания? Если, конечно, всей этой информации недостаточно, то с удовольствием выложу результаты всех сабстрингов)

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Пример работы с модулем.

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

Пока еще на соплях все на столе развалено и код сырой, но работает.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Я свой дровяной пока научил только по звонку с двух номером смски слать с параметрами всеми ) остальное через w5100