Вопрос: WebServer на Arduino. Графическое оформление
- Войдите на сайт для отправки комментариев
Пнд, 03/12/2012 - 11:02
Подскажите есть статьи или готовые исходники с красиво оформленными страницами
Изображения, переходы между страницами, таблицы и т.д.
А не с надписью Hello World или данными с входов /выходов
Подскажите есть статьи или готовые исходники с красиво оформленными страницами
"Красиво оформленная страница" - это не для мощности ардуино. :) Там памяти не настолько много.
Собственно, берете html код "красивой страницы", выкидываете из него все лишнее, а потом просто "печатаете" это из своего скетча.
У меня это делается примерно так: Где сам html код, надеюсь, видно?
Приветствую,
Кстати вопрос по теме. А сколько вообще памяти нужно для HTML?
Из собственного опыта - пробовал написать скетч, чтоб выводил на вебстраничку состояние всех выходов (аналоговых и цифровых) просто в виде таблички и начиная с определенного момента (просто какого то тэга) вся система вешалась наглухо.
Это оно и есть? Т.е. переполнение памяти?
А если так, то можно в таком случае какое нибудь ОЗУ как нибудь подключить?
Это оно и есть? Т.е. переполнение памяти?
Больше похоже на переполнение буфера "сетевой карты". По крайней мере я на enc28j60 увеличивал именно сетевой буфер до 1500 байт. Тут надо либо лезть в теорию и разбираться - умеет ли нынешняя реинкарнация сетевого адаптера слать страницу в нескольких сетевых пакетах (chunked packet), либо ограничиться объемом html кода одного tcp пакета: 1470 байт при общем объеме буфера в 1500 байт.
О! Просветите пожалуйста за увеличение буфера. Где крутить? у меня именно то самое - http://www.ebay.com/itm/Ethernet-Shield-Arduino-Nano-work-ENC28J60-RJ45-Webserver-/281006055332
О! Просветите пожалуйста за увеличение буфера. Где крутить?
У меня в примере была строчка с BUFFER_SIZE 500, я его просто увеличил... Шилд у меня чуть другой, от EKitsZone.
Вы какой библиотекой пользуетесь?
#include "etherShield.h"
#include "ETHER_28J60.h"
Этими?
До каких пределов можно увеличивать буфера? (Нашел. Для этой микрухи _общий буфер_ - 8кб)
Вы какой библиотекой пользуетесь?
#include "etherShield.h"
#include "ETHER_28J60.h"
Нет, у меня с шилдом шла библиотека, ей и пользуюсь...
ls -la EKitsZoneEtherShield/*.*
-rw-r--r-- 1 root root 10645 нояб. 12 23:48 EKitsZoneEtherShield/enc28j60.c
-rw-r--r-- 1 root root 9740 янв. 26 2008 EKitsZoneEtherShield/enc28j60.h
-rw-r--r-- 1 root root 2000 марта 25 2008 EKitsZoneEtherShield/etherShield.cpp
-rw-r--r-- 1 root root 1967 янв. 27 2008 EKitsZoneEtherShield/etherShield.h
-rw-r--r-- 1 root root 16307 янв. 27 2008 EKitsZoneEtherShield/ip_arp_udp_tcp.c
-rw-r--r-- 1 root root 1528 янв. 26 2008 EKitsZoneEtherShield/ip_arp_udp_tcp.h
-rw-r--r-- 1 root root 984 янв. 27 2008 EKitsZoneEtherShield/keywords.txt
-rw-r--r-- 1 root root 2992 янв. 26 2008 EKitsZoneEtherShield/net.h
#include "etherShield.h"
#include "stdio.h"
#include "avr/wdt.h" // include the watchdog library to reboot the Arduino
До каких пределов можно увеличивать буфера?
Надо читать теорию про MTU. :) В сети 10/100 мегабит - максимальный размер tcp пакета - 1500 байт, за минусом технических расходов - полезного в нем получается 1472 байта. Но это верхний предел - пакеты бывают и меньше.
Вообще удивительно разные библиотеки и код для них.
Оцените код Веб Сервера -
Вот один -
А вот второй -
Вот и скажите мне, какой вариант выберет совсем новичек, как я?
Кстати, раз уж пошла речь про зависание, то вот проблемный код, на котором все виснет -
Я бы покопал в части вот этой функции, потому, что в той реализации, что у меня (это Ваш верхний пример) - код требует, чтобы в печать шли данные типа int, а на выходе у Вас там может быть бог знает что.
Что тут можно сделать? Например разделить операции чтения и вывода на печать. Между ними вывести в serial отладочные сообщения со значениями digitalRead. Тем самым Вы поймете - на чем вешается. Либо вообще на время закомментировать вывод на веб-сервер и дать железке время покрутиться: может она зависает просто по причине просадки напряжения питания... В любом случае полезно втыкать отладочный вывод в разных местах кода для проверки состояния.
Извините за мою ошибку. эта строчка осталась от попыток понять причину. ее вообще быть не должно.
Но тут даже и до этого не доходит т.к если закоментить строки , начиная с нее же, т.е. оставить сверху только html создания таблицы для Digital, то виснет прям на этой строке.
e.print(
"<tr><td>"
);
вот прям на ней.
Провел тупейшее исследование.
Результаты удивили
Вот код -
ДуиноВебСервер вешается при выводе четверок.
Провел тупейшее исследование. Результаты удивили ДуиноВебСервер вешается при выводе четверок.
А если закомментировать все предыдущие строчки, кроме "четверок"? :)
Вообще, я бы уже давно попробовал вторую библиотеку на работоспособность, т.к., несмотря на вся ее монтсрообразность - она рабочая.
Монстр даже с единичками не работает при буфере 500 и строковом 22.
Если я ставлю буфер 1500 и строковый 80, то добирается до семерок и на восьмерках дохнет.
Монстр даже с единичками не работает при буфере 500 и строковом 22.
Если я ставлю буфер 1500 и строковый 80, то добирается до семерок и на восьмерках дохнет.
Значит chunked не умеет и надо добровольно ограничиться размером странички в 1400 байт, либо дописать нужный функционал. Хотя, сейчас цена за wiz5100 уже упала и есть смысл покупать его - там, по слухам, нижний уровень tcp реализован в самом чипе.
Короче ВСЕМ!
Разобрался с "простой" библиотекой
#include "ETHER_28J60.h"
Там в файле ETHER_28J60.cpp указан размер буфера и буфера строки -
#define BUFFER_SIZE 500 (надо поставить 1500, НЕ БОЛЬШЕ !!!)
#define STR_BUFFER_SIZE 32 (я поставил 80 - хз на что влияет этот строковый буфер)
После чего мой код из моего сообщения заработал!
В простой библе гораздо приятней писать. Там нет того ада что в монстровой.
Андрей! Спасибо за наводку на размер буфера.
Вот работающий код с таблицами -
Так какой у Вас, в результате, получился максимальный объем странички? Ее нужно сохранить из браузера в файл и посмотреть объем этого файла в проводнике.
Так какой у Вас, в результате, получился максимальный объем странички? Ее нужно сохранить из браузера в файл и посмотреть объем этого файла в проводнике.
есть вопрос :
http://arduino.ru/forum/apparatnye-voprosy/chto-primenit-kak-http-server
Всем доброго времени суток!
Столкнулся с той же самой проблемой...
Насколько я понимаю, можно разбить отправку html на несколько пакетов... Вопрос лишь в том как это сделать, используя данную библиотеку?
функция respond() вызывает две функции
и сама функция отправки данных содержит отсылку флага FIN (разрыв соединения)
Есть ли какие-нибудь соображения, как модифицировать данную функцию под отправку отдельных пакетов и отдельно вызвать завершение отправки, отослав Fin?