Freigeben über


Последовательный порт не только для … «Как обмениваться информацией с микроконтроллером или другим последовательным устройством в VB.Net»

 

Грэг Дункан

Сегодняшний проект Рида Кимбли (Reed Kimble) настолько относится к старой школе, что теперь это уже новая школа. Опыт использования последовательного порта был утрачен (вспомните свой последний компьютер, у которого был последовательный порт?) пока снова не возродился в связи с подъемом микроконтроллеров.

И, фактически, он сделал это на VB, моей первой любви в разработке, что стало сахарной на глазурью на пирожном clip_image002...

Как обмениваться информацией с микроконтроллером или другим последовательным устройством в VB . Net

Введение

С современной дешевой электроникой и технологиями производства небольших партий обычный любитель электроники имеет доступ к изобилию мощных компактных микроконтроллеров (MCU) вместе с огромным ассортиментом периферийных устройств, и почти все они требуют наличия последовательного интерфейса RS-232 для связи с ПК. Доступность и простота использования системы VB.Net сделали ее популярной платформой для разработки небольших целевых приложений, предназначенных для настройки или обмена информацией с микроконтроллерами или устройствами на их основе. Однако очевидно, что выбор компонента SerialPort означает, что есть некоторые ловушки в использовании последовательного порта, и, хотя эти ловушки объяснены в документации, правильная реализация этого компонента по-прежнему может не даваться некоторым разработчикам. В этой статье предпринята попытка объяснить общее использование компонента SerialPort и предложить в качестве примера класс «SerialDevice», инкапсулирующий экземпляр компонента SerialPort вместе с данными и логикой, связанными с его использованием.

Содержание

· Введение

· Микроконтроллеры (MCU)

· Ловушки последовательного порта

· Использование компонента SerialPort

· Пример кода «SerialDevice»

· Описание кода

· Использование примера

· Резюме

Микроконтроллеры ( MCU )

Существует несколько самых популярных микроконтроллерных платформ для хобби и прототипирования, среди которых Arduino, BasicStamp и, из последнего, mBed. Также есть множество других. Обычно платформа содержит процессор с разрядностью от 8 до 32, некоторое количество флеш-памяти, используемой как хранилище, оперативную память, а также ряд периферийных устройств, таких как цифровые и аналоговые системы ввода-вывода, UART, шины I2C/SPI и т. п. Большинство из них не слишком дороги (< 100 долл. США) и вокруг них собираются обширные онлайновые сообщества, а также имеются общедоступные библиотеки кода. Эти устройства популярны как среди конструкторов электроники, так и энтузиастов, и, если вы прошли через введение и установку, то с ними довольно просто работать.

Поскольку эти устройства популярны среди конструкторов электроники и энтузиастов и так как Visual Basic.Net является бесплатным, его легко использовать, и он обеспечивается поддержкой, естественно, что они будут пытаться писать VB-приложения для настройки и связи с микроконтроллерами, имея вначале небольшой или вовсе не имея опыта программирования. Обычно для таких приложений есть ряд ограничений – с микроконтроллером приходится связываться через последовательный порт (иногда через виртуальный последовательный USB-порт), а затем посылать и принимать немного байтов, представляющих команду с параметрами и результат ее выполнения. Иногда ответ представляет собой длинную последовательность байтов данных, требующих дальнейшей обработки, прежде чем сравнить простой результат, но в большинстве случаев результатом будет немного байтов, которые декодируются в статус или в требуемое значение. Благодаря сущности компонента SerialPort и его многопоточных событий, процесс отправления команды, чтения результата и его обработки не так интуитивны, как могут показаться сначала методы объекта SerialPort.

...

Подводные камни последовательного порта

...

Использование объекта SerialPort

...

Пример кода « SerialDevice »

В следующем примере кода определяется класс SerialDevice, включающий объект SerialPort и исполнитель Task? Вместе с функциональностью, обрисованной выше. Этот класс предназначен для обеспечения гибкости использования и может помочь в решении широкого класса задач – от улучшения производительности, до редизайна с целью реализации специфических возможностей. Сначала давайте бегло взглянем на код, а затем перейдем к его детальному разбору.

clip_image004

Описание кода

Класс начинается с объявления объекта SerialPort, потокобезопасной очереди байт для использования в качестве первичного рабочего буфера данных, и наконец, объекта Task вместе со связанными CancellationTokenSource и ManualResetEvent, необходимыми для управления выполнением вторичных потоков…

...

Пример использования

Общий сценарий при работе с MCU состоит в посылке команды для конфигурирования или опроса устройства. Многое встроенное ПО микроконтроллеров использует простой текстовый протокол с данными, передающимися в виде ASCII-текста и управляющими кодами, использующими символы форматирования ASCII. Обычно пользователю достаточно отслеживать появление одиночного символа, такого как Carriage Return (CR) или Line Feed (LF) или Zero (0), обозначающего конец ответа. С этой целью мы создадим простую программу, позволяющую собирать сообщения из символов, полученных от MCU.

Следующий пример демонстрирует использование экземпляра SerialDevice в приложении Windows Forms. В примере используется RichTextBox в качестве консольного экрана, позволяющего пользователю печатать символы, которые будут передаваться MCU, подсоединенному к COM3 (символы не отображаются в RichTextBox по мере печати). Затем MCU просто отправляет эхом любой полученный символ назад в ПК. Делегат CheckMessageComplete ищет символ CR (13) для определения, когда сообщение закончено и делегат ProcessMessage отображает полное сообщение в RichTextBox. Таким образом программа накапливает символы в буфере пока не будет нажата клавиша Enter, и затем целая строка будет напечатана в RichTextBox. Не забывайте, что каждый байт проходит через MCU, прежде чем он попадет в буфер SerialDevice для отображения в RichTextBox.

clip_image006

Резюме

В этой конструкции класс SerialDevice предлагает универсальную платформу для коммуникаций с MCU или другим последовательным устройством независимо от применяемого протокола передачи данных. Аналогичный дизайн можно использовать и в других более узких целях для эффективного анализа и обработки получаемых данных, основанных на особенностях протокола приложения. Таким образом, этот класс должен быть также пригоден для многих быстрого и простого конфигурирования MCU и утилит опроса.

Также пример демонстрирует, как реализовать компонент SerialPort и как напрямую использовать основные процедуры обработки событий без инкапсуляции в класс «SerialDevice». Этот класс можно разобрать на составляющие компоненты, чтобы применить каждую концепцию в других проектах.

Если вы зайдете сюда и прочитаете всю статью, то поймете уникальность SerialPort.