Открытие веб-страницы с использованием ESP8266 в Arduino
Я пытаюсь открыть веб-страницу в ESP8266 через Arduino Mega. Я успешно открыл веб-страницу, если использую AT-команду в последовательном мониторе
Результат идеален
+IPD,382:HTTP/1.1 200 OK
Server: nginx
Date: Sun, 08 May 2016 06:44:47 GMT
Content-Type: text/html
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.26
Set-Cookie: PHPSESSID=rnsmo0b4kq07c5mi3mdsu280g4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
S|R190|W5|O31.0|T0|A24|CLOSED
Как видите, результат в порядке. Теперь, если я выдаю команды с помощью Arduino Serial1.print() и читаю вывод, используя следующий код:
while( Serial1.available() )
{
inChar = Serial1.read();
Serial.write(inChar);
//задержка(1); //можно поиграть с этим значением, если происходит переполнение буфера
} // пока
Вывод пропускает символы случайным образом
+IPD,386:HTTP/1.1 200 OK
Server: nginx
Date: Tue, 17 May wed-y: HP/.5.26
SetCooie:PHPESSD=7kameos5kd7aqcn4e54; pth=
Epirs: hu, 19Nov198 0852:0 GT
ach-Cotro: n-stre,no-ach, mst-evaidate,pos-chck=, pe-ceck0
raga: o-cche
F~SR19|W5O310|T90|ENDLOSD
Я пробовал разные значения delay(), но безрезультатно. Моя скорость передачи данных составляет 9600 как для Arduino Serial, так и для ESP8266 Serial1
.Подскажите пожалуйста, в чем может быть причина? Спасибо
@Sallu, 👍0
Обсуждение1 ответ
Лучший ответ:
Перво-наперво: никогда не используйте задержку при чтении из последовательного порта.
Вы просто слепо пытаетесь прочитать данные и отправить их на другой порт. Это не сработает, если вы не знаете, сколько данных вам нужно прочитать.
И эта информация преподносится вам на блюдечке — вам остается только ее интерпретировать.
Вам необходимо прочитать последовательные данные по мере их поступления и решить, что они означают, а затем делать разные действия в зависимости от этих данных. Например, когда вы читаете символы +IPD
, вы знаете, что у вас есть ответ IP-данных, который нужно интерпретировать. Сразу после этого идет запятая, а за ней число. Это число показывает, сколько байтов вам нужно прочитать, чтобы получить данные. Таким образом, вы продолжаете искать и читать, пока не получите все данные, которые должны получить.
Если вы заметили, что выходные данные содержат **END**. Это флаг, показывающий, что весь ответ был прочитан. Проблема в том, что данные пропускаются в середине случайным образом. **Cache-Control** читается как **ach-Cotro** с пропущенными символами., @Sallu
Я предполагаю, что это что-то происходит *вне* вашего цикла while. Этот цикл не будет читать весь вывод — он будет читать только фрагменты по мере их появления, и другие вещи в вашей программе, которые могут потреблять последовательные байты, мешают. Следуйте моим инструкциям и правильно прочитайте вывод., @Majenko
Я изменил код, как вы сказали, и он работает нормально. Я думаю, что **Serial.print()** используется для чтения **Serial1.read()**. Я сначала читаю вывод в массиве, а затем печатаю, и все отображается нормально., @Sallu
- Загрузка кода Arduino, OTA, через подключенный ESP8266-12E с запущенным Esp-Link
- Проблема с WiFi на Mega + WiFi R3 ATmega2560 + ESP8266
- Последовательная связь arduino mega и D1 Wemos Mini
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Ошибка ESP8266 error: espcomm_upload_mem failed while uploading sketch
- Какой максимальный размер статического документа Json в Arduino JSON?
- esp8266 esp-01 печатает значения мусора на последовательном мониторе
- Ошибка тайм-аута с Arduino Mega и ESP8266 в качестве модуля Wi-Fi
Можете ли вы поделиться с нами командами At для доступа к веб-странице?, @The Zack