Обработка строк с SERIAL

3d_killer
Offline
Зарегистрирован: 13.06.2018

Работаю с 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
 
Что я сделал не так?
 

 

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

3d_killer пишет:
Что я сделал не так?
Поторопился. Вставьте между строками №№ 48 и 49 задержку, скажем delay(10) и отпишитесь как оно. Если также плохо, то обязательно выложите получившийся код.

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

rkit
Offline
Зарегистрирован: 23.11.2016

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

3d_killer
Offline
Зарегистрирован: 13.06.2018
//*************************************************************************************
//Анализ пришедших данных
//*************************************************************************************
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;
              }
            delay(10);
          }    
        Serial.println(data+"1");
        data = "";
      }
  }

На выходе:

TEST2
TEST3
TEST1
 
А что же делать с костылем?
b707
Offline
Зарегистрирован: 26.05.2017

3d_killer пишет:
А что же делать с костылем?

хм... там надо добавить одно слово и переместить одну строчку. чтоб все заработало отлично без костылей

3d_killer
Offline
Зарегистрирован: 13.06.2018

Но вы не скажете :), я правильно понял?

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

3d_killer пишет:

А что же делать с костылем?

Ну, сами подумайте, Вы же теперь понимаете в чём была проблема, так ведь? У Вас available показывал 0 потому, что данные не успели прийти, а Вы считали, что они уже кончились и больше не придут. Значит нужно как-то по-другому определять факт завершения передачи. Например, жёстко ждать символа '\n' столько, сколько потребуется и пока он не придёт, не дёргаться. Только не ставьте никаких делев и мёртвых циклов - это всё нужно делать неблокирующими средствами.

sadman41
Offline
Зарегистрирован: 19.10.2016

Основная идея заключается в постоянном чтении до обнаружения символа-терминатора строки. while там совсем не нужно.

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

3d_killer пишет:

Но вы не скажете :), я правильно понял?

скажу... только ведь ты так ничему не научишься.

На строке 27 добавить слово "static" перед String

Строчку 48 переместить на строку 39 до или после нее

После этого костыль можно убирать. Печать в строке 47 тоже уже не нужна

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

3d_killer пишет:

Но вы не скажете :), я правильно понял?

Да, мне-то нетрудно сказать. Только Вам это этого какой кайф? Моё отношение к прямым подсказкам (в т.ч. и подсказкам мне самому) я сформулировал вот в этом посте, посмотрите, если интересно.

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

rkit
Offline
Зарегистрирован: 23.11.2016

Serial.readStringUntil('\n')

nik182
Offline
Зарегистрирован: 04.05.2015

Вообще полезно ознакомиться со всеми функциями, которые Serial пользует. Помогает костыли не вставлять впрограммы.

https://www.arduino.cc/reference/en/language/functions/communication/serial/

 

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

rkit пишет:

Serial.readStringUntil('\n')

Эта хрень блокирующая :(

rkit
Offline
Зарегистрирован: 23.11.2016

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

Эта хрень блокирующая :(

Напиши неблокирующий вариант Serial, выложи библиотеку.

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

rkit пишет:

Напиши неблокирующий вариант Serial, выложи библиотеку.

Это заказ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Тут уже три человека написали, как сделать неблокирующий вариант. Десять строк в библиотеку ещё оформлять, ISBN получать?

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

sadman41, не спугните заказчика! Я уже дополнительный карман пришивать начал.

rkit
Offline
Зарегистрирован: 23.11.2016

sadman41 пишет:

Тут уже три человека написали, как сделать неблокирующий вариант. Десять строк в библиотеку ещё оформлять, ISBN получать?

Нет, не написали. Нет, не 10 строк.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не написали, так не написали. Гениям - оно виднее, конечно. 

3d_killer
Offline
Зарегистрирован: 13.06.2018

Спасибо, так работает, только вот хотелось бы понять почему работает, что дало static у переменной, в доках не могу этого найти по отношению к переменной

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

3d_killer пишет:

Спасибо, так работает, только вот хотелось бы понять почему работает, что дало static у переменной, в доках не могу этого найти по отношению к переменной

так кто это должен понять - вы или я? :) Если вы - так разбирайтесь. "Не могу найти static в доках" - это откровенное вранье, в любом учебнике по С/С++ это точно есть.

Вот о чем я говорил, когда писал, что написать строчки я вам могу - но вам это не поможет. Если человек даже не может сам найти что-то типа "static in C++" в гугле - в программировании ему делать нечего...

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

3d_killer пишет:

в доках не могу этого найти по отношению к переменной

Где ж это Вы, интересно, искали? На ********.ru? Или на ********.com?

Здесь на этом сайте, в разделе "Программирование" гвоздём прибита тема: "Этюды для начинающих: Память 2. Статические переменные"

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

у мня неблокирующий сериал есь. 

void loop() {

	if (Serial.available()) SendMessage(msg_SerialRead);
	if (jdy.available()) SendMessage(msg_SoftSerialRead);

	if (MessageList.Available()) Dispatch(MessageList.GetMessage());
}


void Dispatch(const TMessage Msg)
{
	switch (Msg.Message)
	{
	case msg_SoftSerialRead: {
		char ch = jdy.read();

		if (ch >= 0x20)
			s1[s1idx++] = ch;
		else
			SendMessage(msg_SoftSerialLineEnd);
	}
		break;

	case msg_SerialRead: {
		char ch = Serial.read();
		if (ch >= 0x20) 
			InpString[InpIdx++] = ch;
		else 
			SendMessage(msg_SerialLineEnd);
	}
		break;

	case msg_SerialLineEnd:
		while (Serial.available()) Serial.read();
		jdy.write(InpString); jdy.write("\r\n");
		memset(InpString, 0, BUFFER_SIZE);
		InpIdx = 0;
		break;

правда, надо https://github.com/DetSimen/Arduino-MessageList   апчитать. 

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

Ну, вот :-( Пропал заказ :-(

3d_killer
Offline
Зарегистрирован: 13.06.2018

b707 пишет:

3d_killer пишет:

Спасибо, так работает, только вот хотелось бы понять почему работает, что дало static у переменной, в доках не могу этого найти по отношению к переменной

так кто это должен понять - вы или я? :) Если вы - так разбирайтесь. "Не могу найти static в доках" - это откровенное вранье, в любом учебнике по С/С++ это точно есть.

Вот о чем я говорил, когда писал, что написать строчки я вам могу - но вам это не поможет. Если человек даже не может сам найти что-то типа "static in C++" в гугле - в программировании ему делать нечего...

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

Если вам хочется показать - вы все говно, а я самый умный, то зачем вы участвуете в форуме для новичков, самоутвердиться?

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

3d_killer,

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

3d_killer пишет:
я программист но на php

и при этом задаёте вопрос

3d_killer пишет:
что дало static у переменной

ответ: static у переменной в С/С++ даёт ровно тоже самое, что и в PHP!

Никто ж Вас за язык не тянул, зачем Вы ляпнули про свои программистские познания? Хорошо хоть только php, а не 20 языков, как у ELITE.

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП, я не сильно много смотрел PHP-кода и, боюсь вас огорчить, но в нём static - что-то вроде птицы Додо.

3d_killer
Offline
Зарегистрирован: 13.06.2018

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

anypool.ru

4x4ug.ru

babylotta.ru

http://xn--161-5cduqj6dl4i3a.xn--p1ai/

вся система управления построена на ajax запросах во взаимодействии с базой данных используется PDO

и я в этом вопросе самоучка, что-то не дочитал и не досмотрел и многих азов (которые мне не понадобились), могу не знать, так что вот так сразу сказать про вранье, вы наверно слишком молод, мне например 35 лет, да и врать мне нет никакого смысла, вам предоставить умнее себя (зачем мне это?), я этого не знаю не сталкивался, что попадалось то прочитал, тонкостей языка я не знаю, пытаюсь что-то постичь, но для себя, но при этом нужно деньги зарабатывать и кормить детей.

Доказательства нужны? пожалуйста мои домены rusrvic.ru share-know.ru могу там развернуть систему управления подключить итнернет магазин, CRM систему, обычный блог или лендинг сделать демо доступ, но о том о чем сейчас шла речь я понятия не имею, и в моих проектах этого просто не найти, единственное что есть в моих проектах это static какой либо класс

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

Я не знаю что такое птица Додо, static в пхп такой же, как везде. Ссылка на его описание есть в моём посте выше.

3d_killer
Offline
Зарегистрирован: 13.06.2018
<?
defined('RS_ACCESS') or die('Нельзя получить прямой доступ к файлу!');
ini_set("max_allowed_packed", "200M"); //Выставляем ограничение на размер запроса
ini_set("memory_limit", "1024M"); //Выставляем ограничение памяти на работу скрипта
define("about","Разработка - Уваров Александр, тел. 8(904)342-44-18, axuvarov@gmail.com");
//*********************************************
//Основной класс движка
//*********************************************
class Core
	{
		protected static $core_instance = NULL;
		//Заголовок
		protected static $head=array(
			"title"=>"Система управления RS-CMS",
			"keywords"=>"",
			"description"=>"",
			"cannonical"=>"",
			"index"=>"",
			"error_404"=>"",
			"lastMod"=>"",
			"viewport"=>""
		);
		//Стили и скрипты
		protected static $css=array();
		protected static $js=array();
		protected static $loadTime=0;		
		//*********************************************		
		//Конструктор
		//*********************************************
		function __construct()
			{
				if (version_compare(PHP_VERSION, "5.3.2", "<")):
					exit("RS-CMS Требуется PHP 5.3.2 или выше!.");
				endif;
				//Подключение функций
				require_once ROOT.DS."engine".DS."functions.php";
				//Проверяем есть ли файл базы данных
				if(!file_exists(ROOT.DS."engine".DS."config_db.php")):
					//Вносим основные скрипты
					Core::AddCss("/engine/style/global_style.css");
					Core::AddCss("/engine/style/install_style.css");
					Core::AddCss("/engine/style/fonts/font.css");
					//Для мобильных
					self::SetViewport();
					//Подключаем инсталятор
					include(ROOT.DS."engine".DS."install.php");	
				else:
					//Подключаем базу данных
					include(ROOT.DS."engine".DS."config_db.php");
					//Загружаем константы
					$this->LoadConstant();
					//Аутенфикация
					Auth::Init();
					//Подключаем контроллер
					if(file_exists(Auth::GetController())):
						include Auth::GetController();
					endif;						
				endif;
			}
		//*********************************************
		//Поделючение стандартных скриптов
		//*********************************************
		protected static function AddDefaultScript()
			{
				self::AddJs("/engine/js/jquery.min.js");
				self::AddJs("/engine/js/jquery.cookie.js");	
			}
		//*********************************************
		//Установка индексирования
		//*********************************************
		//public static function SetViewport($type="width=device-width, initial-scale=1.0"){self::$head['viewport']="<meta name=\"viewport\" content=\"".$type."\">";}
		public static function SetViewport($type="width=1200"){self::$head['viewport']="<meta name=\"viewport\" content=\"".$type."\">";}
		//*********************************************
		//Установка индексирования
		//*********************************************
		public static function SetIndex($type)
			{
				if(!empty($type)){self::$head['index']="<meta name=\"robots\" content=\"".$type."\"/>";}
    			//<meta name="robots" content="all"/> — разрешено индексировать текст и ссылки на странице, 
															//аналогично <meta name="robots" content="index, follow"/>
    			//<meta name="robots" content="noindex"/> — не индексировать текст страницы,
    			//<meta name="robots" content="nofollow"/> — не переходить по ссылкам на странице,
    			//<meta name="robots" content="none"/> — запрещено индексировать текст и переходить по ссылкам на странице, 
															//аналогично <meta name="robots" content="noindex, nofollow"/>
    			//<meta name="robots" content="noarchive"/> — не показывать ссылку на сохраненную копию на странице результатов поиска.
    			//<meta name="robots" content="noyaca"/> — не использовать описание из Яндекс.Каталога для сниппета в результатах поиска.
    			//<meta name="robots" content="noodp"/> — не использовать описание из каталога DMOZ для сниппета в результатах поиска.
			}
		//*********************************************

 

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Я не знаю что такое птица Додо, static в пхп такой же, как везде. Ссылка на его описание есть в моём посте выше.

Ну вот, как редкий человек слышал про птицу Додо, так и редкий пхпшник слышал про статик.

3d_killer
Offline
Зарегистрирован: 13.06.2018

так зачем тогда про вранье, не требовалось оно мне и все там работало и работает без проблем, другое дело МК, там постоянные неведомые проблемы возникают

3d_killer
Offline
Зарегистрирован: 13.06.2018

и что такое птица додо

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

3d_killer пишет:

так зачем тогда про вранье, не требовалось оно мне и все там работало и работает без проблем, другое дело МК, там постоянные неведомые проблемы возникают

вранье было про то, что "про статик в доках ничего нет."

И насчет того, что статика нет в PHP - выглядит особенно забавно на фоне приведенного вами кода в #29. где куча модификаторов static. Если вы используете этот код втемную, не понимая как он работает и зачем в нем используются разные слова - ну значит вы и в PHP ровно такой же "программист", как и в Си...

И главное, мне соверщенно непонятно, к чему это хвастовство своими сайтами, если речь щла лишь о том, чтобы открыть учебник и прочитать полстранички? На что вы обиделись? - вы ожидали, что я вам про static лекцию прочитаю?

sadman41
Offline
Зарегистрирован: 19.10.2016

3d_killer, сейчас вы на чужой территории, так что остыньте. Ну, не слышали - прочитайте. 

Пришёл бы я на форум по PHP и начал качать, что $_POST - какая-то непонятная херня и возмущаться, что нигде она не применяется - как бы на меня там посмотрели?

3d_killer
Offline
Зарегистрирован: 13.06.2018

b707 пишет:

3d_killer пишет:

так зачем тогда про вранье, не требовалось оно мне и все там работало и работает без проблем, другое дело МК, там постоянные неведомые проблемы возникают

вранье было про то, что "про статик в доках ничего нет."

И насчет того, что статика нет в PHP - выглядит особенно забавно на фоне приведенного вами кода в #29. где куча модификаторов static. Если вы используете этот код втемную, не понимая как он работает и зачем в нем используются разные слова - ну значит вы и в PHP ровно такой же "программист", как и в Си...

И главное, мне соверщенно непонятно, к чему это хвастовство своими сайтами, если речь щла лишь о том, чтобы открыть учебник и прочитать полстранички? На что вы обиделись? - вы ожидали, что я вам про static лекцию прочитаю?

да нет конечно, лекции не нужно, там использовал потому что в синглтон классе так нужно (но зачем и почему не могу сказать), все и вся и у меня построено на кусочках знаний и прочтенных мануалах, то есть я умею много чего (разносторонние темы), но конкретно по каждой теме знаю очень мало (к сожалению), когда я обращаюсь на форум, это не пролетает у меня мимо ушей (как тут заметили), я не юзер у администратора (сам отработал администратором 9 лет), я всегда пытаюсь понять почему так, особенно если я этого не знаю.

3d_killer
Offline
Зарегистрирован: 13.06.2018

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто вы сильно напряжены и находитесь "в кольце врагов". 

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

3d_killer
Offline
Зарегистрирован: 13.06.2018

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

 

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

3d_killer пишет:
Доказательства нужны?
Нет. Мне пофиг.

3d_killer пишет:
вы наверно слишком молод, мне например 35 лет

Стариком я себя не считаю, но моя первая программа заработала за 6 лет до Вашего рождения.

3d_killer пишет:
могу там развернуть систему управления подключить итнернет магазин, CRM систему, обычный блог или лендинг сделать демо доступ

Ну, тогда мы просто по-разному понимаем слово "программист".

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

3d_killer пишет:

там использовал потому что в синглтон классе так нужно (но зачем и почему не могу сказать),

Цитата:

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

Вам не кажется, что эти два высказывания противоречат друг другу?

3d_killer
Offline
Зарегистрирован: 13.06.2018

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

И отвечая на этот вопрос, php я уже не занимаюсь, и теперь, немного занимаясь arduino пытаюсь во всем разобраться, что было тогда - уже в прошлом

3d_killer
Offline
Зарегистрирован: 13.06.2018

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