Как собрать string от Com порта?

strarbit
Offline
Зарегистрирован: 12.06.2016

arduino.cc/en/Tutorial/SerialEvent

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

sadman41 пишет:

Значит никакой "ping#" не приходит. И то, что в одинарных кавычках - не строка. Применение такой конструкции может дать любые результаты.

1234# это уже измененный текст

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Одинарные кавычки, это символ, символ '#' я нахожу, но дальше сравнени строки не работает.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Изменённый кем? Я вижу, что в строке накапливается "1234#" и делается поиск вхождения подстроки по indexOf('ping#')

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Раз в секунду отправляю 1234# и ping#

String inString;

void loop() {

if (Serial.available()){
softSerial.println("Ok"); 
delay(5);
 

while (Serial.available()) {
char inChar = (char)Serial.read();
inString += inChar;

if (inChar == '#') {
softSerial.print("Text:"); 
softSerial.print(inString); 
softSerial.println(""); 

if (inString.indexOf("1234#")>0) {
softSerial.println("Tcifry");
}
else if 
(inString.indexOf("ping#")>0) {
softSerial.println("Soedinenie");
}else{
softSerial.println("Net komandy");
}
inString="";
}


}//while (Serial.available()) {
}//if (Serial.available(){



}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Отправляйте "xping#" например. Баг-то на виду - сравните первую посылку и следующие

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Irinka пишет:

 

Раз в секунду отправляю 1234# и ping#

String inString;

void loop() {

if (Serial.available()){
softSerial.println("Ok"); 
delay(5);
 

while (Serial.available()) {
char inChar = (char)Serial.read();
inString += inChar;

if (inChar == '#') {
softSerial.print("Text:"); 
softSerial.print(inString); 
softSerial.println(""); 

if (inString.indexOf("1234#")>0) {
softSerial.println("Tcifry");
}
else if 
(inString.indexOf("ping#")>0) {
softSerial.println("Soedinenie");
}else{
softSerial.println("Net komandy");
}
inString="";
}


}//while (Serial.available()) {
}//if (Serial.available(){



}

 

Если строка inString будет такой: "ping#", то вот это условие - не сработает, т.к. ожидает, что подстрока "ping#" пойдёт со второй позиции:

if (inString.indexOf("1234#")>0)

Чуть ниже - такая же засада. Правильная проверка на нахождение подстроки в строке в любой позиции - это:

if (inString.indexOf("1234#") != -1)

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

DIYMan пишет:

 будет такой: "ping#", то вот это условие - не сработает, т.к. ожидает, что подстрока "ping#" пойдёт со второй позиции:

if (inString.indexOf("1234#")>0)

Чуть ниже - такая же засада. Правильная проверка на нахождение подстроки в строке в любой позиции - это:

if (inString.indexOf("1234#") != -1)

 

Так работает. Спасибо.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017
char buffer[500];

if(sr.available() ){
delay(50);
while(sr.available() ){
buffer[i++] = sr.read(); 
}
if(i>0){
buffer[i++]='\0';
Serial.println(buffer);
Serial.println(i);
i=0;//нужно обнулять переменную i?
//нужно ли чистить buffer[i++],как?



}
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Irinka пишет:

char buffer[500];

if(sr.available() ){
delay(50);
while(sr.available() ){
buffer[i++] = sr.read(); 
}
if(i>0){
buffer[i++]='\0';
Serial.println(buffer);
Serial.println(i);
i=0;//нужно обнулять переменную i?
//нужно ли чистить buffer[i++],как?



}
}

 

1. Если по логике после вывода полученных символов надо опять собирать следующие символы с нулевого индекса массива - то да;

2. Нет, не нужно, главное - не забывать про завершающий '\0', и всё. Часто "очистку" статического буфера делают, просто записав в нулевой элемент массива нолик. Это относится к типу char, ессно;

3. Код - кривоват, и иногда может работать не так, как задумано, например, на высоких скоростях UART за 50 миллисекунд внутренний буфер переполнится, и будет потеря данных. Не говоря уже о том, что при записи в массив нет проверки на вхождение индекса записи в диапазон - в С/С++ легко прострелить себе ногу именно таким образом.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

DIYMan пишет:

3. Код - кривоват, и иногда может работать не так, как задумано, например, на высоких скоростях UART за 50 миллисекунд внутренний буфер переполнится, и будет потеря данных. Не говоря уже о том, что при записи в массив нет проверки на вхождение индекса записи в диапазон - в С/С++ легко прострелить себе ногу именно таким образом.

Как исправить?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

я вот так например буфер построчно заполняю и потом обрабатываю:

void loadDataFromModem() {
  boolean getData = false;
  // load data from modem to buf - only one line (string)
  if (Serial.available()) {
    while (Serial.available()) {
      byte br = Serial.read();
      if (pos_buf < (max_size_resp_buf - 1)) { // if exist place in response buf
        resp_buf[pos_buf] = br; ++pos_buf; getData = true; // save input byte in response buf
        if (br == '\n') if ((pos_buf > 1) && (resp_buf[pos_buf - 2] == '\r')) break; // new string
      } else {
        pos_buf = 0;
        resp_buf[pos_buf] = br; ++pos_buf; getData = true; break; // save input byte in response buf
      }
    }
  }
  if (getData) resp_buf[pos_buf] = 0; // stop byte of string
}

 

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

DIYMan пишет:

в С/С++ легко прострелить себе ногу именно таким образом.

Я всегда так делаю

sadman41
Онлайн
Зарегистрирован: 19.10.2016

andycat, а зачем нужна строка #3, если есть #4?

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

Для надежности.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

sadman41 пишет:

andycat, а зачем нужна строка #3, если есть #4?

Логично, надо упростить, спасибо, только надо будет 16 поднять и без условия.
ЗЫ. До оптимизацией готовых скетче обычно не доходит если быстродействия хватает и все работает (

cyberman
Offline
Зарегистрирован: 30.10.2018

Извините, а разве у Serial есть метод readString() ?..

Нигде не могу найти в описании Serial такого метода. Это какой-то другой Serial?

cyberman
Offline
Зарегистрирован: 30.10.2018

Извините, а вот строчка char buffer[100]; - не слишком ли расточительный расход памяти?

Постоянно сталкиваюсь с дефицитом памяти в Ардуино UNO и такое расходование памяти показалось мне как-то опрометчивым

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

cyberman пишет:

Извините, а разве у Serial есть метод readString() ?..

Нигде не могу найти в описании Serial такого метода. Это какой-то другой Serial?


Не там ищите....
https://www.arduino.cc/reference/en/language/functions/communication/ser...

cyberman
Offline
Зарегистрирован: 30.10.2018

Спасибо