Обработка AT-команд

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

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

Есть ли способ гарантированно корректно обрабатывать ВСЕ символы?

Такое не работает:



{  
  String _resp = "";  
  long _timeout = millis() + 10000;    
  while (!Serial1.available() && millis() < _timeout) {};  
  if (Serial1.available())
  { 
    long _timeout_local;
    do
    {      
      while (Serial1.available())
      {
        int readchar=Serial1.read();
        _resp = _resp+char(readchar);
        _timeout_local = millis() + 5000;            
        if DEBUG
        {
          Logger=Logger+readchar;
          Serial.print(char(readchar));                
          Serial.println(Logger.length());                
        }        
      }      
    } while (millis() < _timeout_local);    
    Serial.println("Timeout local...");    
  }
  else
  {    
    Serial.println("Timeout...");    
  }
  return _resp;
}

 

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

Примеры и на форуме есть и в интернете.
Необходимо полностью переосмыслить работу с входящими байтами, переходить на char, избавляться от String , читайте про циклический буфер.

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

1. Нету ничего, третий день поисков.

2. Меня устраивает мой подход. Мне надо получить по фиксированному таймауту строку и её обработать. Всё, что за таймаутом - неважно. Что здесь не так?

3. Зачем мне циклический буфер?

4. Зачем мне избавляться от String?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а длина буфера у сериала какая, выдерживает 10 секундный таймаут?

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

Зачем ему его выдерживать если символы забираются сразу?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Nikki пишет:
Меня устраивает мой подход.

Ну, а если устраивает, то к чему тогда эта тема?

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

Nikki пишет:

1. Нету ничего, третий день поисков.

2. Меня устраивает мой подход. Мне надо получить по фиксированному таймауту строку и её обработать. Всё, что за таймаутом - неважно. Что здесь не так?

3. Зачем мне циклический буфер?

4. Зачем мне избавляться от String?

3. Уместить в ОЗУ МК например пару тысяч байт ответа от модема достаточно проблематично - получится - поделитесь плиз, самому интересно.
4. См.п.3 - данный объект не очень рационально кушает память. Хотя для простых задач вполне подходит - получится - аналогично просьба поделиться.

http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Nikki пишет:

Зачем ему его выдерживать если символы забираются сразу?

строка 22 так не думает

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

А что не так с 22?

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

Ворота пишет:
Ну, а если устраивает, то к чему тогда эта тема?

К тому, что не устраивают внезапно рандомные куски вывода при корректно работающем посимвольном MultiSerial, взятом за основу. Памяти в 32 кб вроде как более чем достаточно для хранения даже двухкилобайтного массива лога. Если String поставить в MultiSerial он обнуляется где-то при пяти тысячах символов. Что ещё странно - при первом выводе в логе уже килобайт символов, хотя в setup() он был обнулён.

Logik
Offline
Зарегистрирован: 05.08.2014

Очень странно. Странно что фигни в код набросают, приходят за советом и его не слушают. Еще странно миллис некоторые используют, не буду уточнять, еще одной темы про переполнения не хватает;) Но берегитесь сюрпрайзов!

Ну допустим не нашли пример, ну вот оно, http://arduino.ru/forum/apparatnye-voprosy/gsm-modem-a6-v-rezhime-tcp может поможет. 

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

Фигню в коде покажите, пожалуйста.

Ну, то, что платформа себя ведёт как хз что - это вина разрабов платформы, в общем-то. Делаете абстракции - делайте качественно, а не "а здесь рыбу заворачивали".

"Страница не найдена" (

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

Nikki пишет:

Фигню в коде покажите, пожалуйста.

Ну, то, что платформа себя ведёт как хз что - это вина разрабов платформы, в общем-то. Делаете абстракции - делайте качественно, а не "а здесь рыбу заворачивали".

"Страница не найдена" (

Не нравится платформа или не умеете её программировать - валите в другой форум.
Пример в 6 сообщении есть, в atmega328p 2 КБ ОЗУ как вы собрались 5000 байт сохранить денамических данных я например не понял.

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

Понимаете, мне надо не академически исследовать вопрос и знакомиться с философией разрабов МК и дуины, а практически решать задачу в поставленные сроки с обозначенными требованиями. Таймауты устроят, советы поменять подход к обработке и её всю строить вокруг асинхронной хрени - нет. Требования банальны: получить все символы (полкилобайта всего) за заданный промежуток времени полностью совпадающими с результатом MultiSerial.

"Страница не найдена" (

У меня 32 кб.

Сами валите.

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

Круто, свалил.....

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

"Токсичное русское коммьюнити", да.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Nikki пишет:

1. Нету ничего, третий день поисков.

2. Меня устраивает мой подход. Мне надо получить по фиксированному таймауту строку и её обработать. Всё, что за таймаутом - неважно. Что здесь не так?

3. Зачем мне циклический буфер?

4. Зачем мне избавляться от String?

3. Скорее всего не зачем.

4. Затем что это совершенно ненужная приблуда в микроконтроллере. Тяжелое наследие true-плюсанутых программистов забредших с больших машин. Всё нормально делается и без него.

Logik
Offline
Зарегистрирован: 05.08.2014

Nikki пишет:

"Страница не найдена" (

поправил

Logik
Offline
Зарегистрирован: 05.08.2014

Nikki пишет:

"Токсичное русское коммьюнити", да.

это нормально, зло в стадии саморазрушения.

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

Nikki пишет:

У меня 32 кб.

можно уточнить, что за плата у вас?

Nikki
Nikki аватар
Offline
Зарегистрирован: 26.10.2014

Zero.