.
В этой статье рассмотрим реализацию UDP протокола и напишем небольшое приложение, которое будет удаленно управлять нагрузками , подключенными к одному из портов нашего микроконтроллера. Всего в примере можно управлять восемью цифровыми нагрузками , в качестве которых могут быть любые устройства поддерживающие управление от цифрового сигнала. При желание можно доработать и подключить дополнительно к микроконтроллеру датчик температуры , LCD индикатор (посылать на него сообщения) и т.д..
Я не ставил целью сделать полноценное устройство и хотел показать алгоритм работы и пример на асм. Тем не менее устройство работает и работает стабильно. Код открытый , по этому кому будет интересно может доработать устройство под свои задачи.
Сам по себе UDP протокол , является не надежным , он отправляет сообщения без подтверждения и что оно дошло до адресата нет ни какой гарантии. Но это во первых не всегда и нужно , во вторых не требует предварительного соединения , а в третьих можно реализовать обмен программно , как и сделано в этом устройстве. При получении UDP пакета микроконтроллер в ответ передает сообщение о не правильном запросе (команда с ошибкой ) или сообщит состояние порта «D» , при условии правильно указанного пароля , который вводится перед каждой командой . Если пароль введен не правильно от устройства не придет ни какого ответа, т.к. он посчитает этот пакет «ложным».
Протокол описывать нет смысла в интернете достаточно информации , начнем с программное реализации.
В этом примере реализован UDP server (он отвечает на запросы) . Хочу напомнить , что каждый принятый пакет в конечном итоге располагается в ОЗУ микроконтроллера , начиная с адреса 0200h . При получении пакета от ПК микроконтроллер анализирует что за протокол , если это UDP то переходим к его обработке.
Не каждый протокол UDP обрабатывается , а только тот , который приходит на определенный порт . Еще иногда говорят: «Программа слушает такой то порт» … Здесь так же , мы будем «слушать» только порт 1422 . Выбрал просто так , при желании можно поменять на любой другой. Ниже как это реализовано:
Теперь нам стало понятно что это пакет , предназначенный для нас , но перед тем как его обрабатывать необходимо проверить его на ошибки .Для этого нужно подсчитать контрольную сумму пакета и в случае совпадения с контрольной суммой указанной в самом пакете переходим к обработке . ( ПП call Prov_paketa ; ) Для начала проверяем пароль , я указал 1234 .(соответственно можно изменить на любой 4-ч значный).
При любом не правильном значении поднимаем флаг Flag_ch,1 сигнализирующий о не правильности пароля . При выходе из ПП пакет «сбрасывается» и дальше не обрабатывается , ответ на ПК не приходит. Если пароль правильный переходим к анализу полученной команды. Алгоритм «расшифровки» команды такой же , только проверяем не все слова, а всего два знака в слове выключить и включить проверяем на соответствие вторые знаки , следующий знак в команде это номер нагрузки №2. Вот так выглядит команда на включение 2-й нагрузки -1234 включить №2 , после получения которой мы формируем один из двух ответов. Если команда расшифрована и выполнена , то ПК получит следующий вот такой ответ :
Можно просто ввести пароль и отправить сообщение (в нашем случае 1234) , в ответ получим то же такое сообщение , что дает нам возможность проверки состояние порта. Если команда передана не правильно (с ошибкой ) то она не будет выполнена , если не верно указан пароль получим ответ : « Не правильный запрос» . Как формируется сам ответ можно посмотреть в программе , ни чего сложного нет , остановимся на том , как собрать все это в пакет UDP и отправить на ПК. Вот так выглядит UDP пакет , выделенная область это наш текстовый ответ о состоянии порта.
Пакет ограничен 255 байтами - это достаточно для ответа, (можно увеличить , доработав немного программный код) . Ответ записываем в ОЗУ начиная с адреса 0x022E, по окончании записи для расчета длины пакета считывается адрес последнего записанного знака из регистра FSR0L . На основании полученных данных рассчитываются количество байт для расчета контрольной суммы, количество байт для отправки , записи длины IP пакета и длины самого UDP пакета. Данные длины записываются в пакет , рассчитывается контрольная сумма и отправляем пакет адресату. При необходимости изменения текстовых сообщений (ответов ) следует учитывать ограничение - не более 210 знаков . После выполнения команды состояние порта записывается в EEPROM , что дает возможность запоминать состояние включенных / выключенных нагрузок при пропадании питания. При повторении конструкции необходимо указать IP адрес из диапазона вашей сети . По умалчиванию прописан 192.168.1.4
В следующей статье мы рассмотрим реализацию на asm протокола TCP и будем управлять этими же нагрузками по WEB интерфейсу при помощи стандартного браузера.
Задать вопросы можно на форуме.
Скачать программу, прошивку, проект MPLAB asm.
Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2021 © ChipMK.ru
![]() |
|