Подскажите по работе с w5100
- Войдите на сайт для отправки комментариев
Пт, 28/11/2014 - 06:52
Подключаюсь к серверу, считываю текст (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();
вы уверены, что сервер вам все отдает? сейчас не редкость когда контент зависит от того какой агент (браузер) делает запрос
Строка данных просто обрывается на середине.
попробуйте без этих строк, в минимальном запросе HTTP они лишние, не понимаю их смысл
У uno памяти - 2к, mega - 8к. Куда да вы хотите впихнуть 18к ?
У uno памяти - 2к, mega - 8к. Куда да вы хотите впихнуть 18к ?
Так он вроде и не пихает их никуда, посимвольно в порт выводит...
Может мы не весь код видим?
Я с microSD под 400кБ (яваскрипт) в браузер отдавал. Проблем небыло.
char inChar = client.read();
А никуда пихать не нужно.
В прмере выше используется просто вывод в сериал, а в проекте очередной принятый байт присто парсится. Т.е. в памяти фактически находиться всего одна обрабатываемая строка.
char inChar = client.read();
И?
alexvs, а скетч продолджает работать дальше?
Вообще, как мне кажется, пробллема в том что по умолчанию размер приемного буфера на каждый сокет - как раз 2Кб. Т.е. происходит заполнение буфера, а дальше надо что-то сделать что бы получить следующие 2Кб.
alexvs, а скетч продолджает работать дальше?
Да, продолжает, проходит установленное время, сново происходит соединение с сервером и сново я получаю первые 2Кб.
Если кому интересно, то вот ссылка, откуда я получаю данные: http://api.openweathermap.org/data/2.5/forecast?q=Krasnoyarsk&mode=xml&units=metric
char inChar = client.read();
И?
С строкой пкрепутал. После суток мерещится всякое.
char inChar = client.read();
И?
С строкой пкрепутал. После суток мерещится всякое.
Отдыхать нужно! :)
Хочу торгов дождаться.
Вообще, как мне кажется, пробллема в том что по умолчанию размер приемного буфера на каждый сокет - как раз 2Кб. Т.е. происходит заполнение буфера, а дальше надо что-то сделать что бы получить следующие 2Кб.
Так и есть, вот тут объяснение причины: http://forum.arduino.cc/index.php/topic,44524.0.html
Попробуйте изменить w5100.h и w5100.cpp размер буфера увеличить и количество сокетов уменьшить.
Попробуйте изменить w5100.h и w5100.cpp размер буфера увеличить и количество сокетов уменьшить.
Вечером попробую, но интересно бы было найти решение как выбрать всю информацию не меняя размер буфера...., хотя скорее всего это не получится, т.к. сервер отдал данные и его не чешет, что клиент не успел принять :(
памяти явно будет не хватать. единственный адекватный способ - организовать "кэш" на Sd-карте или в EEPROM
памяти явно будет не хватать. единственный адекватный способ - организовать "кэш" на Sd-карте или в EEPROM
Какой памяти? Где? Я не собираю весь текст страницы, а обрабатываю побайтно.
Ну вот результат: поправил файлы w5100.h, w5100.cpp, Ethernet.h, Ethernet.cpp, получилось 2 сокета и 4Кб.
Это прокатило, а вот 1 сокет и 8Кб - уже не хочет работать. Интересно что в результате принимается не 4096 байт, а больше, но не вся страница. И если просто выводить побайтно в сериал, принимается больше, чем если я заменяю вывод в сериа на свой парсер (обработчик).
я не собираю весь текст страницы, а обрабатываю побайтно.
значит выражайтесь точнее ))
фраза из первого поста "считываю текст веб-страницы" из первого поста, подразумевает, что нужен весь текст страницы полностью.