выделить символ

slon0177
Offline
Зарегистрирован: 16.04.2015

Всем доброго здровья!

Не пинайте сильно - понимаю что тема изъезжена, но вот столкнулся с трудностями при чтении данных и пока решить не получается..

Есть дисплей nextion 7 inch. Есть программачтения последовательного порта, вот она:

[code]
    if(mySerial.available())// если есть данные...
      {
        char incomingChar= mySerial.read();// читаем посимвольно
        if( incomingChar =='T'|| incomingChar =='E'|| incomingChar =='P'|| incomingChar =='L'|| incomingChar =='O'|| incomingChar >= '1'&& incomingChar <= '8' )
        {
         message+=incomingChar;// составляем строку из нужных символов         
        }
                            
         Serial.print(message);//печатаем строку
         CurrStr= message;
         Serial.print(CurrStr);                 
          
        message="";// очищаем строку
      }   

[/code]

Нужная мне строка (ТЕПЛО26) составляется . Трудности начинаются при попытке выделить подстроку со значением (26).

Ни одна из функций класса String не работает...

Прошу помощи!

 

 

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

slon017 пишет:

Ни одна из функций класса String не работает...

Враки.

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

Помощи в чем?  Ктонить приехает, будет паяльной лампой жечь String?  

slon0177
Offline
Зарегистрирован: 16.04.2015

Уточню: substring и charAt не дают ничего

slon0177
Offline
Зарегистрирован: 16.04.2015

Как мне выделить число из строки "TEPLO26"? 

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

Твоего кода мы не видели вовсе. С чего такие выводы?

slon0177
Offline
Зарегистрирован: 16.04.2015
[code]
#include <EEPROM.h>
#include <SoftwareSerial.h>


//int count =0;
//int timer_TFT ;//переменная для хранения значения таймера отключения экрана
//int flag_timer;//флаг записи значения таймера отключения экрана

SoftwareSerial mySerial(8, 9);                        
String message; //здесь храним полученное в порту


void setup()
{
    mySerial.begin(9600); 
    Serial.begin(9600);              
 }
 

void loop()
{
    if(mySerial.available())// если есть данные...
      {
        char incomingChar= mySerial.read();// читаем посимвольно
        if( incomingChar =='T'|| incomingChar =='E'|| incomingChar =='P'|| incomingChar =='L'|| incomingChar =='O'|| incomingChar >= '1'&& incomingChar <= '8' )
        {
         message+=incomingChar;// составляем строку из нужных символов         
        }
                            
         Serial.print(message);//печатаем строку
         CurrStr= message;
         Serial.print(CurrStr);                 
          
        message="";// очищаем строку
      }   
       
         
     
     
}
[/code]

 

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

Сходите на родной сайт. Почитайте про стринг. Там больше информации.

https://www.arduino.cc/reference/en/language/variables/data-types/string...

slon0177
Offline
Зарегистрирован: 16.04.2015

попробую)

 

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

Если этта твой скетч, где в нем substring и charAt?

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

и где тут substring или charAt ?

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

slon0177
Offline
Зарегистрирован: 16.04.2015

услышал вас. исправляюсь

#include <EEPROM.h>
#include <SoftwareSerial.h>


//int count =0;
//int timer_TFT ;//переменная для хранения значения таймера отключения экрана
//int flag_timer;//флаг записи значения таймера отключения экрана

SoftwareSerial mySerial(8, 9);                        
String message; //здесь храним полученное в порту


void setup()
{
    mySerial.begin(9600); 
    Serial.begin(9600);              
 }
 

void loop()
{
    if(mySerial.available())// если есть данные...
      {
        char incomingChar= mySerial.read();// читаем посимвольно
        if( incomingChar =='T'|| incomingChar =='E'|| incomingChar =='P'|| incomingChar =='L'|| incomingChar =='O'|| incomingChar >= '1'&& incomingChar <= '8' )
        {
         message+=incomingChar;// составляем строку из нужных символов         
        }
                            
         Serial.print(message.substring(5));//печатаем строку
                         
          
        message="";// очищаем строку
      }   
       
         
     
     
}

 

slon0177
Offline
Зарегистрирован: 16.04.2015

вот так ничего не печатеется

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016
int i = atoi(strpbrk(my_string,"1234567890"));

Строка ессно в классическом смысле, а не этот бред "String"! ;))))

А то, что ТС опубликовал - просто бред.

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

Слон, вставьте на строке 29 оператор Serial.print(message); и посмотрите, что у вас в строке. Уверен, что вы удивитесь

slon0177
Offline
Зарегистрирован: 16.04.2015

b707, в начальном варианте как раз и было Serial.print(message); в мониторе порта выходило TEPLO26

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

b707 пишет:

Слон, вставьте на строке 29 оператор Serial.print(message); и посмотрите, что у вас в строке. Уверен, что вы удивитесь

чтобы он понял, что происходит, нужно еще пробел напечатать после месседж, тогда нагляднее будет.

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

А закомментируй ка 25 строчку

slon0177
Offline
Зарегистрирован: 16.04.2015

если закомментировать строчку 25, в порт свалится куча всякого хлама

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

Паняна. 

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

slon0177 пишет:

b707, в начальном варианте как раз и было Serial.print(message); в мониторе порта выходило TEPLO26

ну а все-таки попробуйте. Думаю, что сейчас там не будет TEPLO26

slon0177
Offline
Зарегистрирован: 16.04.2015

b707 пишет:

slon0177 пишет:

b707, в начальном варианте как раз и было Serial.print(message); в мониторе порта выходило TEPLO26

ну а все-таки попробуйте. Думаю, что сейчас там не будет TEPLO26

попробовал. печатает TEPLO 26

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

slon0177 пишет:

b707 пишет:

slon0177 пишет:

b707, в начальном варианте как раз и было Serial.print(message); в мониторе порта выходило TEPLO26

ну а все-таки попробуйте. Думаю, что сейчас там не будет TEPLO26

попробовал. печатает TEPLO 26

да. Дракула был прав

Вставьте пожалуйства, две строки

Serial.print(message);
Serial.println( " = ");

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый! 25 строчка порочна и надо ее чем-то заменить.

Например считываем порт посимвольно и как только появляется Т считываем еще 4 символа, а затем сравниваем с TEPLO если подходит, считываем 2 символа и их печатаем. Неоптимально, но не даст кучу непоняток, как 25 строка.

slon0177
Offline
Зарегистрирован: 16.04.2015

получается куча = и где то в середине нужные мне данные...

вообще запутался...

slon0177
Offline
Зарегистрирован: 16.04.2015

теперь вижу...  попробовал вставить Serial.print("="); куча хлама

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

slon0177 пишет:

получается куча = и где то в середине нужные мне данные...

вообще запутался...

Воот! Ваша строка 25 никуда не годится - она не не фильтрует нужные данные.

Попробуйте прикинуть - Ваш "фильтр" в строке 25 отбирает из входящих данных не только строчку TEPLO, но и любую комбинацию из этих букв - например "T" "TE" "TEP", а так же "EP" "EEEE" "TTTTT" "OLPET" и сотни и тысячи других бредовых вариантов

slon0177
Offline
Зарегистрирован: 16.04.2015

b707, извините, не знаю Вашего имени...

а как же получить то что мне нужно?

 

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

slon0177 пишет:

а как же получить то что мне нужно?

Ну, для начала не надо ничего проверять, пока число накопленных в message символов не станет больше длины строки "TEPLO26" - так как очевидно, что до этого сравнивать бессмысленно

как сравнить две строки в С:

https://ru.wikihow.com/%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B8%D1%82%D1%8C-%D0%B4%D0%B2%D0%B5-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8-%D0%BD%D0%B0-%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-C

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

сорри, вчитался внимательнее по ссылке - местами явный бред попадается, видимо машинный перевод

Вот тут вроде получше

http://all-ht.ru/inf/prog/c/func/strcmp.html

slon0177
Offline
Зарегистрирован: 16.04.2015

b707 - спасибо! знаний у меня конечно нет совсем). Буду изучать!)

slon0177
Offline
Зарегистрирован: 16.04.2015

wdrakula пишет:

int i = atoi(strpbrk(my_string,"1234567890"));

Строка ессно в классическом смысле, а не этот бред "String"! ;))))

А то, что ТС опубликовал - просто бред.

wdrakula, спасибо!  теперь въехал