Случайные символы возвращаются в последней части http-ответа от ESP8266 к Arduino

Я работал над подключением моего проекта Arduino к Интернету с помощью WiFi-модуля ESP8266. Я использую библиотеку StateMachine для управления командами AT, отправляемыми с Arduino на модуль WiFi и на прогрессировать состояние в зависимости от ответа. StateMachine обрабатывает такие вещи, как повторные попытки, если модулю не удалось подключиться к сети Wi-Fi.

До сих пор все было успешно, StateMachine сбрасывает модуль WiFi в начале скетча, проверяет, подключен ли он к WiFi, подключается к https API и успешно отправляет некоторые данные. Последний шаг — проверить, успешно ли ответил API, и здесь я столкнулся с проблемой.

API отправляет часть JSON обратно в модуль WiFi в HTTP-запросе-ответе. Я вижу заголовки http, но через несколько строк ответ превращается в случайные символы.

Ниже показан вывод моего последовательного монитора Arduino. Вы можете видеть успешное выполнение StateMachine, а затем http-ответ в конце, который сначала выглядит правильно, а затем превращается в мусор:

Starting
ESP8266: Status is New
ESP8266: Status is ResetDone
ESP8266: Status is ReceiveModeSet
ESP8266: Status is ConnectedToWifi
ESP8266: Status is ConnectedToHost
ESP8266: Status is SendReady
ESP8266: Status is FirstMsgSent
ESP8266: Status is FirstResponseReceived
HTTP/1.1 200 OK
Date: Sat, 12 Nov 2022 08:35:16 GMT
Content-Type: application/json
Content-Length: 80
Connection: keep-alive
xanRusd 2f51-1-3285faxa-i-:eqfFA
A-a-:o13a-bb9935d
nSuek:688226992810072AICT
R

Мой скетч фиксирует последовательный ответ модуля WiFi, используя следующий код:

String serial_response;
char serial_incoming_char=0;

// Серийный поток от ESP8266
while(Serial3.available())
{
  serial_incoming_char=Serial3.read();
  serial_response = serial_response + String(serial_incoming_char);
}

Я протестировал модуль Wi-Fi вручную, напрямую отправив ему те же AT-команды с помощью последовательного терминала. Этот метод успешно отправляет мне полный http-ответ без мусора в конце.

Мне интересно, не возникает ли мусор из-за проблем с памятью, вызванных увеличением длины строки serial_response. Я начал читать о строках C, чтобы посмотреть, смогу ли я заменить строку serial_response строкой C. Я еще не выполнил эту задачу, так как нужно учиться, и я подумал, что попрошу помощи, прежде чем тратить время.

Скорость передачи между ESP8266 и Arduino Mega составляет 115200 бод. Это аппаратный последовательный порт, поскольку ESP8266 находится на той же плате, что и Arduino Mega. 9600 между Arduino Mega и ПК.

Полный скетч находится на Github: https://github.com/undiplomatic/tomcat/blob/main/. WiFi_connect_test

Ожидаемый ответ от API:

HTTP/1.1 200 OK
Date: Sun, 13 Nov 2022 08:48:25 GMT
Content-Type: application/json
Content-Length: 80
Connection: keep-alive
x-amzn-RequestId: 7011a007-ca0b-46cd-99e8-ef54a88193f3
x-amz-apigw-id: biBV7E86IAMFqlQ=
X-Amzn-Trace-Id: Root=1-6370af58-4981805d3a8459da47275e7b

{"nextSequenceToken":"49620196462595825072128408813148921519685050950987285266"}

, 👍-1

Обсуждение

что-то не так в вашей схеме, @Juraj

Вы можете проверить теорию «проблемы с строковой памятью», записав символы непосредственно в последовательную консоль «Arduino», вместо того, чтобы сначала собирать их в строку. Какой сдвиг уровня (если есть) вы используете между ESP8266 и «Arduino» и какова скорость передачи данных последовательного соединения между двумя устройствами?, @6v6gt

@ 6v6gt хорошая идея переписать напрямую серийный номер Arduino. Я должен буду гуглить, что такое смещение, поскольку я не знаю. Я отредактировал вопрос, указав скорость передачи (115200)., @rcx935

@rcx935 - смена уровня. Это сдвиг уровня напряжения. ESP8266 — это устройство на 3,3 вольта, а ваш Arduino Mega — на 5 вольт. Вы можете найти что-то, что вы можете использовать здесь, что я нашел с помощью быстрого поиска: https://www.instructables.com/A-Quick-Guide-on-Logic-Level-Shifting/. Я также попытался бы уменьшить скорость передачи данных между ESP8266 и Mega в качестве меры по устранению неполадок. Было бы неплохо увидеть ваш код Mega., @6v6gt

поэтому @ 6v6gt я могу выполнять AT-команды со скоростью 500000 бод от Mega Serial3 до esp8266 без переключателя уровня, так что здесь это не проблема, @Juraj

Я добавил ссылку на код. ESP8266 находится на той же плате, что и Mega (это Arduino с WiFi), и они соединены вместе, поэтому я предполагаю, что плата заботится о разнице напряжений в последовательном соединении., @rcx935

@ rcx935 Я думаю, вы правы, что о смещении уровня нужно позаботиться с помощью той комбинированной платы, которая у вас есть. Та модель конечного автомата, которую вы используете, довольно скрывает базовую логику. Я предлагаю вам попробовать гораздо более простой скетч, который просто выдает AT-команды, которые, по вашим словам, вы успешно ввели вручную, а затем попробуйте распечатать результаты, чтобы увидеть, существует ли эта проблема с повреждением., @6v6gt

как должен выглядеть ответ, когда все в порядке?, @Juraj

@Juraj Я добавил образец ответа., @rcx935

@ 6v6gt вы правы, у меня была более ранняя версия, в которой не использовался конечный автомат, который давал правильный результат. Я еще раз просмотрю предыдущий набросок и посмотрю, что может быть причиной этого., @rcx935

похоже, у вас переполнение последовательного буфера. часть ответа отсутствует. лучше, когда esp8266 отправляет данные, чтобы прочитать их как можно быстрее и больше ничего не делать, @Juraj

Насколько я знаю, размер последовательного буфера Arduino составляет 64 байта, и это кольцевой буфер. Если вы заполняете его со скоростью 115 кбод и читаете с него со скоростью 9600 бод, это может вызвать проблемы. Я не говорю, что это твоя проблема. Но стоит попробовать. (Установите последовательную скорость 115200 между Arduino Mega и ПК или сделайте скорость обоих соединений с Mega равной каким-либо другим способом.) Просто предположение. ;-), @Peter Paul Kiefer