Подскажите по работе с w5100

alexvs
Offline
Зарегистрирован: 22.07.2014

Подключаюсь к серверу, считываю текст (XML) с web-странички. Если подкллючаюсь браузером, то размер текста в итоге примерно 18Кб. Если подключаюсь Ардуиной с помощью шилда на w5100, то считывается первые 2Кб и все. Как получить оствшуюся информацию? Вот код обработчика:

 if (client.connect(FCserver, 80))
  {
    Serial.println("Connected!");
    client.println("GET /data/2.5/forecast?q=Krasnoyarsk&mode=xml&units=metric HTTP/1.1");
    client.print("Host: ");
    client.println(FCserver);
    client.println("Connection: close");
    client.println();
    while (!client.available());
    while (client.available())
    {
        char inChar = client.read();
        Serial.print(inChar);
    //  readNextByteThreeHour();
    }
  }
  client.stop();

 

axill
Offline
Зарегистрирован: 05.09.2011

вы уверены, что сервер вам все отдает? сейчас не редкость когда контент зависит от того какой агент (браузер) делает запрос

alexvs
Offline
Зарегистрирован: 22.07.2014

Строка данных просто обрывается на середине.

axill
Offline
Зарегистрирован: 05.09.2011

попробуйте без этих строк, в минимальном запросе HTTP они лишние, не понимаю их смысл

client.print("Host: ");
client.println(FCserver);
client.println("Connection: close");

 

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

У uno памяти - 2к, mega - 8к. Куда да вы хотите впихнуть 18к ?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

buka пишет:

У uno памяти - 2к, mega - 8к. Куда да вы хотите впихнуть 18к ?

Так он вроде и не пихает их никуда, посимвольно в порт выводит...

Может мы не весь код видим?

Я с microSD под 400кБ (яваскрипт) в браузер отдавал. Проблем небыло.

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

alexvs пишет:

        char inChar = client.read();

        Serial.print(inChar);

alexvs
Offline
Зарегистрирован: 22.07.2014

А никуда пихать не нужно.

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

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

buka пишет:

alexvs пишет:

        char inChar = client.read();

        Serial.print(inChar);

И?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

alexvs, а скетч продолджает работать дальше?

alexvs
Offline
Зарегистрирован: 22.07.2014

Вообще, как мне кажется, пробллема в том что по умолчанию размер приемного буфера на каждый сокет - как раз 2Кб. Т.е. происходит заполнение буфера, а дальше надо что-то сделать что бы получить следующие 2Кб.

 

alexvs
Offline
Зарегистрирован: 22.07.2014

Gippopotam пишет:

alexvs, а скетч продолджает работать дальше?

Да, продолжает, проходит установленное время, сново происходит соединение с сервером и сново я получаю первые 2Кб.

Если кому интересно, то вот ссылка, откуда я получаю данные: http://api.openweathermap.org/data/2.5/forecast?q=Krasnoyarsk&mode=xml&units=metric

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

Gippopotam пишет:

buka пишет:

alexvs пишет:

        char inChar = client.read();

        Serial.print(inChar);

И?

С строкой пкрепутал. После суток мерещится всякое.

 

alexvs
Offline
Зарегистрирован: 22.07.2014

buka пишет:

Gippopotam пишет:

buka пишет:

alexvs пишет:

        char inChar = client.read();

        Serial.print(inChar);

И?

С строкой пкрепутал. После суток мерещится всякое.

 

Отдыхать нужно! :)

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

Хочу торгов дождаться.

Araris
Offline
Зарегистрирован: 09.11.2012

alexvs пишет:

Вообще, как мне кажется, пробллема в том что по умолчанию размер приемного буфера на каждый сокет - как раз 2Кб. Т.е. происходит заполнение буфера, а дальше надо что-то сделать что бы получить следующие 2Кб.

Так и есть, вот тут объяснение причины: http://forum.arduino.cc/index.php/topic,44524.0.html

 

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

Попробуйте изменить w5100.h и w5100.cpp размер буфера увеличить и количество сокетов уменьшить.

alexvs
Offline
Зарегистрирован: 22.07.2014

buka пишет:

Попробуйте изменить w5100.h и w5100.cpp размер буфера увеличить и количество сокетов уменьшить.

Вечером попробую, но интересно бы было найти решение как выбрать всю информацию не меняя размер буфера...., хотя скорее всего это не получится, т.к. сервер отдал данные и его не чешет, что клиент не успел принять :(

Maverik
Offline
Зарегистрирован: 12.09.2012

памяти явно будет не хватать. единственный адекватный способ - организовать "кэш" на Sd-карте или в EEPROM

alexvs
Offline
Зарегистрирован: 22.07.2014

Maverik пишет:

памяти явно будет не хватать. единственный адекватный способ - организовать "кэш" на Sd-карте или в EEPROM

Какой памяти? Где? Я не собираю весь текст страницы, а обрабатываю побайтно.

alexvs
Offline
Зарегистрирован: 22.07.2014

Ну вот результат: поправил файлы w5100.h, w5100.cpp, Ethernet.h, Ethernet.cpp, получилось 2 сокета и 4Кб.

Это прокатило, а вот 1 сокет и 8Кб - уже не хочет работать.  Интересно что в результате принимается не 4096 байт, а больше, но не вся страница. И если просто выводить побайтно в сериал, принимается больше, чем если я заменяю вывод в сериа на свой парсер (обработчик).

Maverik
Offline
Зарегистрирован: 12.09.2012

alexvs пишет:

я не собираю весь текст страницы, а обрабатываю побайтно.

значит выражайтесь точнее ))

фраза из первого поста "считываю текст веб-страницы" из первого поста, подразумевает, что нужен весь текст страницы полностью.