Не работает ethernet shield
Остання редакція VaDoSiQ (2017-11-10 12:04:07)
Lic Control Учасник Зареєстрований: 2016-01-23 Повідомлень: 124 VaDoSiQ Учасник З Ukraine Зареєстрований: 2017-02-06 Повідомлень: 6Я извиняюсь, можно подробнее? Про Watchdog я читал. Как аппаратно перезагрузить шилд? Я так понимаю ножку ресет на шилде, нужно выбрасывать?
кудрявый Учасник Зареєстрований: 2017-12-14 Повідомлень: 16В своей конструкции с Arduino Uno, Ethernet Shield W5100 проблему зависаний решил так:
резет шилда - отрезал ногу разьема на шилде (нужно в двух местах собственно резет и его дубль на ISP колодке).
Резет завел от одного из выходов УНО и делаю его программно, в секции сетап скетча.
Если случается зависание - резет этого бутерброда через Watchdog.
Можно принудительно резетить это все через определенное время, я сделал это раз в сутки, просто без причин. Можно через 2 мин (видел описание подобной конструкции)
Мой опыт работы с W5100 говорит о том, что зависания для нее обычное дело.
P.S. А ресетить часто сетевую плату - дело дурное.
кудрявый Учасник Зареєстрований: 2017-12-14 Повідомлень: 16Мой опыт работы с W5100 говорит о том, что зависания для нее обычное дело.
P.S. А ресетить часто сетевую плату - дело дурное.
Дурное дело - давать советы, когда ты не в теме ))
В приведенной статье - исправление ошибки монтажа (если она есть - 510 ом вместо 49,9 по даташиту).
Из-за этого плата не работает с длинными (5м уже длинный) кабелями и капризна с разными роутерами/комутаторами.
Но если уж заработала, то работает.
А зависает она по причине перегрузки микроконтроллера W5100 и тут паяльник можно. (гусары молчать!)
Увы, перезапуск зависшей платы (шилда) - только через ресет.
Куча проектов, где авторы жалуются на такую "особенность" W5100. Погуглите.
Вот один из них.
цитата:
"Необходимо учитывать следующее. Веб - сервер на Arduino не использует многопользовательскую мультипрограммную операционную систему. Поэтому при обращении одного клиента передача данных будет идти только к нему. Второй клиент начнет получать данные только после закрытия соединения с первым клиентом. Поэтому большая HTML страница должна быть разбита на маленькие, которые быстро загружаются и сервер закрывает соединение. Благодаря этому может появиться возможность обращению к серверу 2-3 клиентов почти одновременно. Примерно через 10-15 минут интенсивного обращения к серверу он зависает (по опыту виснет Ethernet Shield W5100)."
Добрый день, есть ethernet shield с чипом w5100 ардуино, соединяю их, включаю шилд в роутер, у роутера ip 192,168,1,1, шилду програмно пишу ip 192.168.1.14, запускаю скетч веб сервер и никакой реакции, сведодиоды мигают а из браузера перейти по адресу 192.168.1.14 не могу, не найдено пишет. сериал порт выдаёт server is at 0.0.0.0
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Код для нетелепатов привели бы :)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Как минимум шилд должен тем или иным способом получить ненулевой IP и начать откликаться на команду ping.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
код стандартный из библиотеки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Не пингуется, rx мигает tx нет
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Там же все программно. Нормального TCP стека нет. Не отвечаете на пинг, вот и не пингуется
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Как тогда у всех остальных работает, у меня нет, на ютубе кучу рольков посмотрел, всё делаю тоже самое , заливаю скеч, включаю в роутер, моску dns ip mac всё указываю, смотрю в сериал а там server is at 0.0.0.0. Ну как так. Что за х. с ним. Подскажите ктонить чёнить разумное.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
. rx мигает tx нет.
Помню летом пришли Визнеты, так вот у них была перепутана разводка одного из диодов в Ханране.
А дорожки были под коннектором. Пришлось их выпаивать и переворачивать диод.
Правда плата работала и так, просто не было одной индикации.
Хотя, не помню у кого, какой-то из диодов используется для задачи режима работы контроллера.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Достал с полки MEGA 2560 + w5100. Точно помню, что работало.
Сейчас: заливаю стандартный пример, в итоге: server is at 0.0.0.0, но пинги проходят, rx tx отчаянно мигают при ping
В браузере тишина и покой.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
У меня всё заработало, Просто контакты были плохие. проверяйте контакты, пишите тестовые программы. Посомтрите что на выходах. В общем продебажить нужно.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Достал с полки MEGA 2560 + w5100. Точно помню, что работало.
Сейчас: заливаю стандартный пример, в итоге: server is at 0.0.0.0, но пинги проходят, rx tx отчаянно мигают при ping
В браузере тишина и покой.
Именно такая же проблема ,но ардуино у меня UNO .Не понимаю почему не подключается в браузере
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
т.к. Ethernet висит на 10 пине:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
А причем тут пин 4 ардуино?Не допонял..
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
4й пин используется на w5100 шилде для работы с sd картой, если она не используется - надо её отключить задав 1.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сделал как сказали-но не в какую.
Может с роутером что-то не то..А подключив к компу можно как-то проверить работы шилда?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пропиши IP вручную
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Прописал как Вы сказали код сейчас выглядит вот так
Но снова тишина.
В сом порт выдает server is at 0.0.0.0
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
И да, вот это добавлял в код:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
И да, вот это добавлял в код:
Я решил проблему покупкой нового шилда((((
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
У меня была связка код на яве и ардуина на этом же шилде но в паре с мегой, работало замечательно. После слёта системы потерялся скетч, код проги на яве был продублирован на флешке. Так вот теперь при работе ардуины как сервер наблюдается седующий глюк, можно отправлять данные на ардуину только сразу после создания сокета в яве, создал сокет и тут же нужно передавать, если сделать паузу ровно в 5 сек ардуина отваливается и повторно на неё завязатся не получается. Предавать можно сколько угодно пакетов, главное без таймаута, что за фигня и как её побороть я так и не вкурил.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
тем у кого W5100 "вроде работает а вроде нет" - советую подключить его к компу коротким сетевым шнурком и дать адреса шилду и сетевой карте компа из одной подсети, без dhcp. удивительное рядом.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Есть проблема с изернет-шилдом. Сервер работает, но как то странно. Выдаёт в браузер пару- тройку строк с данными, а затем набор нечитаемых символов. Каждый раз количество правильно переданной информации- разное. Может кто сталкивался с такой бедой. Программно перепробовал кучу вариантов. Сбои происходят даже на статических страничках. Начинаю грешить на конкретный, доставшийся мне от китайцев, экзумпляр. Что скажете?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Это у вас где то выхлд за пределы массива. Короче код вы криво написали.
В декабре из "шанхая" пришло пять плат W5100. Четыре вроде работают, а одна мертвая была. Как раз IP не получала. Чип дохлый оказался :( И еще, в процессе ковыряния выяснилось, что встречаюся маршрутизаторы/коммутаторы, стемящиеся поднять скорость до гигабита, ну вот кажется им, что должна плата с такой скоростью работать. Нужно либо запретить автоопределение скорости на хабе, либо смениь его на другой.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
За пределы массива влядли вышел, эксперементировал на оф. примере. Всего пять строк по десятку символов. , но попробую урезать. А вот хабик поменяю. Спасибо.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
За пределы массива влядли вышел, эксперементировал на оф. примере. Всего пять строк по десятку символов. , но попробую урезать. А вот хабик поменяю. Спасибо.
Можете не так сложно. Поменяйте длинну UTP5. У меня любит коротышки 20см на TP-link 1000Mbit/s, а на работе подавай моток 5 метров на неком плюгавом zyxel100Mbite/s. Дешевле и быстрей. Свичами развлекаться это мне не интересно было. Это все из области танцев с бубуном. ;) Но работает. Все с одной бухты откусываю Ж-) Скоро буду думат в направлении "avr/wdt.h" когда подвисает. Иногда 2-ое стуок на ура а иногда за день глюкнет. Короче буду думать как код "вилизать". По коду пока не въехал как правильно "казнить нельзя помиловать" wdt_reset();..или. wdt_disable(); ;)- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я решил свою проблему, всё оказалось и проще и сложнее одновременно. Не там искал.
По порядку: У меня шилд с SD-картой. Первоначально отладил кусок кода работы с картой и занялся веб-сервером. Как говорил выше, он работал странно и пока я с ним ковырялся не обратил внимания, что перестала работать SD-карта. Чего на неё смотреть? Отладил ведь.
Ан нет! Шилд не умеет работать одновременно как накопитель и веб. Проблема обсуждалась и решена во здесь:
Вем спасибо, всё заработало.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Доброго времени суток всем!
Проблема схожая с вышеописанными: есть ардуино уно и ethernet shield родные итальянские. Заливаю стандратный скетч из примеров: светодиод on горит, АСТ мигает, но даже в Serial port пусто. Физический линк на сетевом интерфейсе RJ-45 есть (на ethernet shield горит сетевая индикация (оба светодиода), но не моргает!). В чем может быть проблема?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ещё только разбираюсь с ардуино, но не смог найти такой проблемы как у меня.
Имеется свежая MEGA 2560 R3, с десяток программ тестовых заливал, всё работало. Тут приехал Ethernet Shield W5100. Если поставить его на мегу, то мега как будто перестает работать - при заливке скетча IDE подвисает, а потом выдает "timeout communicating with programmer". Убираем W5100 и всё прошивается, работает.
Думаю не стоит говорить, что если с отключенным шилдом залить стандартный пример вебсервера (с изменением кода на pinMode (53, OUTPUT) под мегу), то он зальется, но после установки шилда мега как будто виснет, программа не выполняется. На W5100 из всей индикации горит только PWR. При подключении к свитчу индикация активности как на свитче, так и на шилде отсутствует.
Подозреваю, что прислали неисправный шилд? Продавец открещивается, говорит всё новое в упаковке, рабочее. Ещё есть время открыть диспут, но как ему доказать?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Проблема в том, что при подключённом W5100 Ардуина не может принять скетч. Зависает с ошибкой в передаче по СОМ порту. Но при снятом W5100 прошил тсандартный пример WebServer-а со своими параметрами и сервер поднялся. Виден через Web-интерфейс и выдаёт данные по аналоговым входам. Кто-нибудь сталкивался с таким? Просто в дальнейшем для написания/отладки сетевых параметров как-то не очень греет каждый раз вынимать и вставлять шилд.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Проблема в том, что при подключённом W5100 Ардуина не может принять скетч. Зависает с ошибкой в передаче по СОМ порту. Но при снятом W5100 прошил тсандартный пример WebServer-а со своими параметрами и сервер поднялся. Виден через Web-интерфейс и выдаёт данные по аналоговым входам. Кто-нибудь сталкивался с таким? Просто в дальнейшем для написания/отладки сетевых параметров как-то не очень греет каждый раз вынимать и вставлять шилд.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Не хотелось бы быть некрофилом, но тем не менее. Имею точно такую же проблему, китайскую UNO R3 и w5100. Правда исполнена она не в виде шилда, а извращенским модулем.
Пинг успешно проходит, даже на максимально допустимом размере пакета в 119 байт, но при этом скетч web-server'а из примера выдает адрес 0.0.0.0 и на вебку, соответственно не пускает. Пару раз отловил неадекватные адреса в стиле 24.168.0.1. Но затем и они пропали. При пинге RX и TX успешно отмаргиваются о получении-отправке пакета. Может я что-то упустил?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пару дней назад закрыл диспут возвратом половины суммы за лот из двух таких шилдов W5100 Mini Red. Пинг не проверял, но стандартный пример так же выдавал "0.0.0.0", пару раз показал нормальный адрес и совершенно произвольный. На шилде горела одна лампочка, стабилизатор выдавал нормальное напряжение. Логический анализатор показал, что на MISO данные отсутствуют у обоих экземпляров. Продавец из Shen Zhen Blue Sky technology выставил рефунд на $2 с условием возврата этого мусора и майку на себе рвал, доказывая, что "goods brand new original only" и ''buyer do not know how its work", несмотря на то, что я предъявил скриншоты с анализатора, фото шилдов с размазанным флюсом, каплями припоя по всей плате, вручную паянными SMD и отпечатками китайских пальцев. Словом - полным набором признаков подвальной сборки.
В этой статье рассмотрим Ethernet Shield W5100 с помощью которого можно подключить плату Arduino к интернету или локальной сети. Shield основан на чипе Wiznet W5100 с поддерживаемой скоростью передачи данных до 100 Мбит/с. Используют данный Shield совместно с Arduino можно организовать простой веб-сервер с доступом к этому серверу.
Технические параметры
► Напряжение питания: 5 В
► Внутренний буфер: 16 кбит
► Скорость подключения: 10 и 100 Мбит/с (RJ45)
► Разъем для карт памяти: micro-SD
► Габариты: 73 мм х 54 мм х 27 мм
Общие сведения
Чтобы подключить Ethernet Shield W5100 к Arduino (UNO или MEGA), предусмотрены длинные штыревые разъемы, так же поверх W5100 можно установить другие Shields. Для хранения больших файлов на плате установлен разъем micro-SD, для установки micro-SD карт. Плата Arduino взаимодействует как с W5100, так и с SD-картой, используя шину SPI (вывода 10, 11, 12 и 13 (UNO) и 50, 51 и 52 (MEGA), на обеих платах вывод 10 используется для выбора W5100 и вывод 4 для выбора SD-карты, эти вывода нельзя использовать (это надо учесть, при проектировании). Так-как W5100 и SD-карта используют одну шину SPI, одновременно может быть активно только одно устройство. Для подключения к маршрутизатору или компьютеру, установлен стандартный разъем RJ45. Кнопка RESET дублирует кнопку RESET на Arduino, который сбрасывает как W5100, так и плату Arduino.
Назначение светодиодов:
► PWR: указывает, что подано питание на плату.
► LINK: указывает наличие сетевого канала и мигает, когда экран передает или принимает данные
► FULLD: указывает, что сетевое соединение полнодуплексное
► 100M: указывает на наличие сетевого соединения 100 Мбит/с
► RX: мигает, когда экран получает данные
► TX: мигает, когда экран отправляет данные
► COLL: мигает, когда обнаруживаются сетевые конфликты
Помимо этих светодиодов, есть два светодиода, расположенные на гнезде RJ45, при подключении кабеля, один светится постоянно, а другой мигает в соответствии с потоком данных.
Принципиальную схема Ethernet Shield W5100 можно посмотреть ниже
Устранение проблемы c W5100
Существует проблема с некоторыми Ethernet Shield на базе W5100. Производитель поставил неправильную сборку их четырех резисторов, вместо 49,9 Ом установил 510 Ом. Из-за этого Shield W5100 нестабильно работает при подключении к роутеру или вовсе не работает c маршрутизатором (свичем). На данный момент, существует два варианта устранения данной проблемы:
► Первый вариант, просто заменить резисторную сборку на 51 Ом, но если у вас нету опыта в пайке SMD компонентов, лучше воспользоватся вторым способом.
► Второй способ, установить дополнительные резисторы на 100 Ом, между контактами 1 и 2, 3 и 6. Теперь W5100, будет работать более стабильнее.
Подключение W5100 к Arduino
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Ethernet Shield W5100 x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
В этой статье я опишу ситуацию с которой столкнулся во время разработки проекта Arduino Mega Server. Суть дела заключается в том, что существует такая библиотека Arduino Ethernet Library, написанная для поддержки сетевой платы Ethernet Shield на чипе W5100. Это стандартная плата и стандартная библиотека, которая многие годы поставляется в комплекте со средой разработки Arduino.
И эта библиотека является основой для всех проектов, использующих обмен информацией по проводной сети. Так вот, оказалось, что эта библиотека попросту профнепригодна. На ней в принципе невозможно построить нормальное сетевое взаимодействие. Можно только «баловаться» одиночными запросами и ответами. Ни о каком построении серверов на базе этой библиотеки речь не может идти. Почему?
Потому, что эта библиотека имеет встроенный «баг», который подвешивает неодиночные запросы на время от трёх до десяти секунд и более. Баг именно встроенный и автор библиотеки об этом знал, о чём свидетельствует его пометки в исходниках (но об этом несколько позже).
Тут нужно понимать, что библиотека, поставляемая с официальной средой разработки является неким стандартом и если у вас не работает проект, то вы будете искать дефект где угодно, только не в стандартной библиотеке, ведь ей много лет и ею пользуются сотни тысяч, если не миллионы людей. Не могут же они все ошибаться?
Почему в природе не существует серверов на Arduino
Когда я стал разбираться, то выяснилось, что серверу ничто не мешает ответить, но, тем не менее, запрос «висит» девять с лишним секунд, а при другой итерации этот же запрос висит уже около трёх секунд.
Подобные наблюдения повергли меня в глубокую задумчивость и я перекопал весь код сервера (заодно размялся) но дефектов не обнаружил и вся логика вела к «святая святых» библиотеке Arduino Ethernet Library. Но крамольную мысль, что виновата стандартная библиотека я отбрасывал, как неадекватную. Ведь с библиотекой работают не только пользователи, но и огромное количество профессиональных разработчиков. Не могут же они все не видеть столь очевидных вещей?
Забегая вперёд, скажу, что когда выяснилось, что дело именно в стандартной библиотеке, стало понятно почему в природе не существует (нормальных) серверов на Arduino. Потому, что на базе стандартной библиотеки (с которой работает большинство разработчиков) построить сервер в принципе невозможно. Задержка ответа в десять секунд и более выводит сервер из категории собственно серверов и делает его просто (тормозной) игрушкой.
Промежуточный вывод. Это не Ардуино не подходит для построения серверов, а сетевая библиотека ставит крест на очень интересном классе устройств.
Анатомия проблемы
Теперь от лирики давайте перейдём к техническому описанию проблемы и её практическому решению. Для тех, кто не в курсе, стандартное место расположения библиотеки (в Windows):
И первое, что мы рассмотрим, это функция из файла EthernetServer.cpp
Когда я преодолел психологический барьер (под давлением логики) и начал искать дефект в Ethernet Library я начал именно с этой функции. Заметил я и странный комментарий автора, но не придал ему значения. Перелопатив всю библиотеку, я опять, но уже через пару дней и сильно продвинувшись в сетевых технологиях, вернулся к этой функции потому, что логика подсказывала, что проблема именно здесь и более внимательно посмотрел на комментарий.
Друзья, там всё написано открытым текстом. В вольном переводе это звучит примерно так «это работает, но не всегда». Подождите минуточку, что значит «не всегда»? У нас же не воскресный клуб по игре в лото. А когда не работает, то что? А вот когда «не работает» и начинаются проблемы с задержкой в десять секунд.
И автор об этом определённо знал, о чём свидетельствует самооценка его творения — три икса. Без комментариев. Эта библиотека является основой для многих клонов и, внимание, эти три икса кочуют из одного проекта в другой. Если вы разработчик, то не заметить эту проблему можно только не разу не протестировав сетевой обмен. Тоже без комментариев.
Для тех, кто плохо разбирается в коде поясню суть проблемы простыми словами. Цикл перебирает сокеты и, как только находит подходящий, возвращает клиента, а остальных просто игнорирует. И они висят по десять секунд, пока «карты благоприятно не лягут».
Решение проблемы
Поняв причину проблемы, мы конечно не остановимся на этом и попробуем её решить. Для начала давайте перепишем функцию таким образом, чтобы получение или не получение сокета не зависело от воли случая и происходило всегда, если есть свободный. Это решит две проблемы:
- запросы не будут зависать
- «последовательные» запросы превратятся в «параллельные», что значительно ускорит работу
Убираем цикл, явным образом указываем сокет и ничего не теряем — если он свободен, то мы гарантированно получаем клиента (если он нам подходит).
То же самое «по цепочке» проделываем с кодом функции accept, убираем цикл и явно указываем сокет.
Вот, собственно и всё. Мы внесли изменения в стандартную библиотеку и поведение сервера кардинально изменилось. Если раньше всё работало очень медленно, за гранью любых представление о юзабилити, то теперь скорость загрузки страниц значительно возросла и стала вполне приемлемой для нормального использования.
Обратите внимание на уменьшение задержки в 3 — 5 раз для разных файлов и совсем другой характер загрузки, что очень заметно при практическом пользовании.
/*
Mod for Arduino Mega Server project
fix bug delay answer server
*/
EthernetServer::EthernetServer(uint16_t port) _port = port;
>
void EthernetServer::begin() for (int sock = 0; sock < MAX_SOCK_NUM; sock++) EthernetClient client(sock);
if (client.status() == SnSR::CLOSED) socket(sock, SnMR::TCP, _port, 0);
listen(sock);
EthernetClass::_server_port[sock] = _port;
break;
>
>
>
void EthernetServer::begin_(int sock) EthernetClient client(sock);
if (client.status() == SnSR::CLOSED) socket(sock, SnMR::TCP, _port, 0);
listen(sock);
EthernetClass::_server_port[sock] = _port;
>
>
void EthernetServer::accept() int listening = 0;
for (int sock = 0; sock < MAX_SOCK_NUM; sock++) EthernetClient client(sock);
if (EthernetClass::_server_port[sock] == _port) if (client.status() == SnSR::LISTEN) listening = 1;
>
else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) client.stop();
>
>
>
void EthernetServer::accept_(int sock) int listening = 0;
EthernetClient client(sock);
if (EthernetClass::_server_port[sock] == _port) if (client.status() == SnSR::LISTEN) listening = 1;
>
else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) client.stop();
>
>
EthernetClient EthernetServer::available() accept();
for (int sock = 0; sock < MAX_SOCK_NUM; sock++) EthernetClient client(sock);
if (EthernetClass::_server_port[sock] == _port &&
(client.status() == SnSR::ESTABLISHED ||
client.status() == SnSR::CLOSE_WAIT)) if (client.available()) // XXX: don't always pick the lowest numbered socket.
return client;
>
>
>
return EthernetClient(MAX_SOCK_NUM);
>
EthernetClient EthernetServer::available_(int sock) accept_(sock);
EthernetClient client(sock);
if (EthernetClass::_server_port[sock] == _port &&
(client.status() == SnSR::ESTABLISHED ||
client.status() == SnSR::CLOSE_WAIT)) if (client.available()) return client;
>
>
return EthernetClient(MAX_SOCK_NUM);
>
size_t EthernetServer::write(uint8_t b) return write(&b, 1);
>
size_t EthernetServer::write(const uint8_t *buffer, size_t size) size_t n = 0;
//accept();
for (int sock = 0; sock < MAX_SOCK_NUM; sock++) accept_(sock); // added
EthernetClient client(sock);
if (EthernetClass::_server_port[sock] == _port &&
client.status() == SnSR::ESTABLISHED) n += client.write(buffer, size);
>
>
return n;
>
/*
Mod for Arduino Mega Server project
fix bug delay answer server
*/
class EthernetServer:
public Server private:
uint16_t _port;
//void accept();
void accept_(int sock);
public:
EthernetServer(uint16_t);
//EthernetClient available();
EthernetClient available_(int sock);
virtual void begin();
virtual void begin_(int sock);
virtual size_t write(uint8_t);
virtual size_t write(const uint8_t *buf, size_t size);
using Print::write;
>;
Оставшиеся проблемы
В таком виде сервер из демонстрации идеи переходит в категорию вещей, которыми можно пользоваться в повседневной жизни, но остались некоторые проблемы. Как вы видите на скриншоте ещё присутствует не принципиальная, но неприятная задержка в три секунды, которой не должно быть. Библиотека написана так, что мест, где код работает не так, как нужно, очень много и если вы квалифицированный разработчик, то ваша помощь в установлении причины трёхсекундной задержки будет очень ценной. И для проекта Arduino Mega Server и для всех пользователей Arduino.
Последний момент
Поскольку мы изменили код стандартной библиотеки, то и вызывать её функции нужно несколько иным способом. Здесь я привожу код, который реально работает и который обеспечивал работу AMS на скриншоте выше.
Здесь задача перебора сокетов перенесена на уровень клиентского скетча и, что самое главное, и в чём смысл всего вышесказанного, не происходит «подвисания» запросов. И функция собственно сервера:
С полным кодом сервера вы можете ознакомиться, скачав дистрибутив с официального сайта проекта Arduino Mega Server. А задать возникшие вопросы можно на форуме. Осталось решить последнюю проблему трёхсекундной задержки и у нас будет настоящий, быстро работающий сервер на Ардуино. Кстати, скоро выйдет новая версия AMS со всеми исправлениями и улучшениями в которой решена одна из самых актуальных проблем — автономная работа без поддержки сервера MajorDoMo.
И возможным это стало во многом благодаря тем исправлениям стандартной библиотеки Arduino Ethernet Library о которых я вам сейчас рассказал.
Дополнение. Открыт канал на Youtube и вот промо ролик Arduino Mega Server, который демонстрирует работу с реальной системой.
Продолжаем цикл слёзных историй про китайские Arduino-модули.
На этот раз речь пойдёт про китайскую копию Arduino Ethernet Shield, на базе чипа W5100, которая чуть не стала причиной запоя сотрудников двух отделов.
В общем, есть такая штуковина:
которая втыкается в Ардуйню и позволяет получить доступ к локальной сети.
В сердце модуля чип W5100 — достаточно неплохой, аппаратно поддерживает TCP, обмен с микроконотроллером по SPI на частоте до 15МГц, позволяет несложными телодвижениями организовать как TCP-клиент, так и TCP-сервер, и при этом стоит недорого.
Всё это собрано китайцами по схеме оригинального итальянского модуля. Конечно, к схеме тоже есть вопросы, например, зачем на плате размещается 74LVC14D — 6 инвертирующих буферов. Из которых 5 висят в воздухе, а один зачем-то подаёт низкий уровень на вход SEN (т.е. отключает режим SPI), когда линия на линии CE высокий уровень. На кой ляд это нужно — не понятно, ведь входы выходы SPI и так переходят в третье состояние, когда на CE высокий уровень. Ну да ладно. UPD: Как подсказали в комментариях, согласно аппноту, W5100 не отпускает линию MISO, когда на CS высокий уровень. Поэтому и нужен инвертор, который будет выставлять низкий уровень на входе SEN, полностью отключая SPI и позволяя использовать иные устройства, в частности, карту памяти, слот для которой есть на этой же плате
Модуль, конечно, не без проблем. Особенно проблемы связаны с инициализацией при медленно нарастающем напряжении питания, из-за чего, если использовать стандартные ардуино-библиотеки, модуль не инициализируется. Кроме того, известны проблемы этих библиотек, которые приводят к увеличенному времени отклика и неправильной работе сокетов. Но поскольку я готовыми библиотечками не пользуюсь, для меня всё это не проблема, соединения стабильные, а нюансы легко обойти.
Но вот одна проблема заставила поломать голову.
Выражалось это в следующем: собранное устройство отлично работает, если подключено кроссовером к компьютеру, или подключено к сети через роутер. Но как только подключается через свитч, пинги не ходят, соединение не устанавливаются, а иногда даже лампочки мигают. Пробовали разные кабели, разные свичи. Результат один — через роутер или напрямую — нормально, через свич — никак.
Технические специалисты уже готовы были уйти в запой, я уже было подумал, а не забухать ли и мне? Но, к счастью, проблема оказалось не новой. Немного гугления привели меня к ответу.
Дело оказалось вооот в этой резисторной сборке:
Порт подключения HR911105A содержит в себе согласующие резисторы со стороны линии, и трансформаторы для гальванической развязки.
То, что обведёно кружочком — это согласующие резисторы, которые находятся со стороны чипа.
Если посмотреть на схему шилда, то это сборка RN1 — 4ре резистора по 49,9 Ом.
Можно посмотреть, например, reference schematic на w5100 и увидеть то же самое: R6, R7, R14, R15 — по 49,9 Ом.
Однако китайцы решили, что резистор большой роли не играет и решили впаять 510 Ом, в 10 раз больше чем положено. Разумеется, это привело к рассогласованию, и сигнал стал очень кудрявой формы. Видимо, контроллеры в роутерах и компьютерах ещё могут с этим жить, а вот в свичах — уже не очень.
По хорошему, эту резисторную сборку хорошо бы заменить на хотя бы 51-Омную. Но у меня под рукой такой не оказалось. Зато были резисторы 110 Ом размером 0805 и 1206. Их то я и напаял параллельно линиям RX и TX (ножки 1-2 и 3-6, соответствено. Поскольку тут поддерживается автоматическое определение типа кабеля, то нельзя сказать наверняка, кто из них будет передатчиком, а кто приёмником)
В итоге, схема прекрасно заработала через свитч, и через роутер связь стала более стабильной, а технические специалисты были спасены от внезапного алкоголизма.
Хотя так и осталось мне не понятным: почему же с неправильным резистором работает через роутер, но не работает через свитч? В чём разница? Хотя, возможно дело в том, что свичи были в основном D-Link'и, а роутеры в основном TP-Link'и, но суть различий всё равно не ясна.
Читайте также: