Открытие веб-страницы с использованием 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

.

Подскажите пожалуйста, в чем может быть причина? Спасибо

, 👍0

Обсуждение

Можете ли вы поделиться с нами командами At для доступа к веб-странице?, @The Zack


1 ответ


Лучший ответ:

0

Перво-наперво: никогда не используйте задержку при чтении из последовательного порта.

Вы просто слепо пытаетесь прочитать данные и отправить их на другой порт. Это не сработает, если вы не знаете, сколько данных вам нужно прочитать.

И эта информация преподносится вам на блюдечке — вам остается только ее интерпретировать.

Вам необходимо прочитать последовательные данные по мере их поступления и решить, что они означают, а затем делать разные действия в зависимости от этих данных. Например, когда вы читаете символы +IPD, вы знаете, что у вас есть ответ IP-данных, который нужно интерпретировать. Сразу после этого идет запятая, а за ней число. Это число показывает, сколько байтов вам нужно прочитать, чтобы получить данные. Таким образом, вы продолжаете искать и читать, пока не получите все данные, которые должны получить.

,

Если вы заметили, что выходные данные содержат **END**. Это флаг, показывающий, что весь ответ был прочитан. Проблема в том, что данные пропускаются в середине случайным образом. **Cache-Control** читается как **ach-Cotro** с пропущенными символами., @Sallu

Я предполагаю, что это что-то происходит *вне* вашего цикла while. Этот цикл не будет читать весь вывод — он будет читать только фрагменты по мере их появления, и другие вещи в вашей программе, которые могут потреблять последовательные байты, мешают. Следуйте моим инструкциям и правильно прочитайте вывод., @Majenko

Я изменил код, как вы сказали, и он работает нормально. Я думаю, что **Serial.print()** используется для чтения **Serial1.read()**. Я сначала читаю вывод в массиве, а затем печатаю, и все отображается нормально., @Sallu