Arduino и Sim800l подключение по mqtt
- Войдите на сайт для отправки комментариев
Здравствуйте, тема которую создал ранее под таким же именем пропала, сначала была ошибка 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" при обработке?
получать ответ побайтно, сохранять его в буфер и искаь в буфере те ключевые слова которые вы ищите.
как только ключевое слово найдено - выполнять действие и очищать буфер.
ЗЫ. Пример я уже выкладывал, но почему то вы даже не пытаетесь в нем искать отвесты на свои вопросы.
http://arduino.ru/forum/programmirovanie/snova-mqtt-1?page=1#comment-460595
получать ответ побайтно, сохранять его в буфер и искаь в буфере те ключевые слова которые вы ищите.
как только ключевое слово найдено - выполнять действие и очищать буфер.
ЗЫ. Пример я уже выкладывал, но почему то вы даже не пытаетесь в нем искать отвесты на свои вопросы.
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); // для наглядности и отладки }Накидывать в строку до переполнения плохая идея- может начальная часть нужной команды попасть на конец буфера, соответственно команда не дойдёт до МК - не надёжное устройство. Или оператор кинет рекламную смс и забьёт вам весь буфер.
Тогда или использовать кольцевой буфер или обрабатывать все что приходит по uart побайтно в online.