Arduino и Sim800l подключение по mqtt

Zara
Offline
Зарегистрирован: 12.12.2018

Здравствуйте, тема которую создал ранее под таким же именем пропала, сначала была ошибка 500 а затем "не найдено".

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

Если использовать варинт из интернета с delay(1)

  if (Serial3.available()) { 
    while (Serial3.available()) {
      k = Serial3.read();
      at += char(k);
      delay(1);
}
    
    Serial.println(at);             


  }

То строчка ответа от модема рандомно приходит то целой то по частям, т.е. я ожидаю ответ в формате

>topicValue

а получаю примерно так:

>topi

>cValue

или: 

>topicVal

>ue

иногда приходит все ок.

Если убрать delay(), т.е. 

  if (Serial3.available()) {   
    while (Serial3.available()) {
      k = Serial3.read();
      at += char(k);
}
    
    Serial.println(at);             


  }

то все приходит по символу, т.е.

>t

>o

>p

>i

>c

>V

>a

>l

>u

>e

Еще в начале строки которая идет от mqtt сервера приходит значек стрелки вверх и ноль

кто подскажет для чего?

Вопрос в том как получить весь ответ строкой для дальнейшего стравнения? И можно ли разделить "topic" и "value" при обработке?

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

получать ответ побайтно, сохранять его в буфер и искаь в буфере те ключевые слова которые вы ищите.

как только ключевое слово найдено - выполнять действие и очищать буфер.

ЗЫ. Пример я уже выкладывал, но почему то вы даже не пытаетесь в нем искать отвесты на свои вопросы.

http://arduino.ru/forum/programmirovanie/snova-mqtt-1?page=1#comment-460595

 

Zara
Offline
Зарегистрирован: 12.12.2018

andycat пишет:

получать ответ побайтно, сохранять его в буфер и искаь в буфере те ключевые слова которые вы ищите.

как только ключевое слово найдено - выполнять действие и очищать буфер.

ЗЫ. Пример я уже выкладывал, но почему то вы даже не пытаетесь в нем искать отвесты на свои вопросы.

http://arduino.ru/forum/programmirovanie/snova-mqtt-1?page=1#comment-460595

 

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

  if (Serial3.available()) {   
   if(string_from_modem.length() > 30) {
  string_from_modem = "";
  }
    while (Serial3.available()) {
      k = Serial3.read();
      if(isAlphaNumeric(char(k))) { // проверка на число или букву

        at += char(k); // предварительно закидываем полученные за раз символы в строку
        }
        
}

Serial.println("at>>>>>>>"); Serial.print(at); // для наглядности и отладки    

string_from_modem += at; // добавляем строку в буфер для поиска нужной команды 

Serial.print("string>>>>>>>"); Serial.println(string_from_modem); // для наглядности и отладки

 

  
  }

 

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

Накидывать в строку до переполнения плохая идея- может начальная часть нужной команды попасть на конец буфера, соответственно команда не дойдёт до МК - не надёжное устройство. Или оператор кинет рекламную смс и забьёт вам весь буфер.

Тогда или использовать кольцевой буфер или обрабатывать все что приходит по uart побайтно в online.