В продолжение темы с UDP в Arduino - примеры и новая версия библиотеки.
В новой версии два изменения:
1. Если вы уже успели начать использовать предыдущую версию, то поменяйте обработку значения, возвращаемого ClientUDP::open(). Раньше успехом была единица, в случае неудачи - ноль. Теперь все наоборот ;) Если все успешно - будет ноль, в противном случае - это код ошибки.
Причина такого изменения тривиальна - в оригинальном Client.cpp довольно много мест, где стоит проверка и немедленный "молчаливый" возврат нуля: поди-ка разберись, почему open() "накрылся" - то ли сокетов свободных нет, то ли порт занят. Константы ошибок описаны в ClientUDP.h, быстродействие и размер кода не изменились.
2. Появилась публичная переменная uint16_t _sent, в которой сохраняется число переданных байт.
А вот это из-за специфики класса Print, от которого порожден оригинальный класс Client и мой "плагиатный" ClientUDP. Прототип write возвращает void, и чтобы иметь хоть какой-то шанс понять, отправилась дейтаграмма или нет, можно прочитать после ее вызова значение _sent. Расплата за это - два байта SRAM.
Скачать новую версию с примером (про который далее): ClientUDP_1.1.zip
Итак, для эксперимента надо взять пару Arduino:
...( это оригинальная Diecimila и Freeduino MaxSerial )...
Также понадобится две штуки Ethernet Shield:
...( это оригинальная Ethernet Shield и вариант от NKC Electronics )...
Следующий естественный ;) шаг - соединение их попарно:
...а также - в комплексе:
Платы работают в режиме разделения функций: к первой подключены три кнопки, она является передатчиком. Ко второй подключены светодиоды, и она - соответствено - является приемником. По нажатию или отпусканию кнопки формируется двухбайтовый UDP-пакет (номер кнопки + состояние), который отсылается приемнику. Приемник "декодирует" пакет, зажигая или гася соответствующий светодиод:
В качестве портов, к которым подключены и кнопки, и светодиоды, выбраны digital 7,6,5. Значение порта, ip-адресов и mac-адресов выбрано весьма произвольно, не ищите там скрытого смысла ;)
В процессе работы над материалом, мне показалось, что лучше один раз увидеть, чем 100 раз написать в блоге, родилась идея записать ролик. Его я и представляю на ваш скромный суд (заранее прошу прощения за славянский акцент ;)
А есть в ethernet-шилдах автодетекция crossover или прямого кабеля?
ОтветитьУдалитьAuto MDI/MDIX? Да, поддерживает. Это в спецификациях Wiznet W5100 пробито.
ОтветитьУдалить