Обмен данными между STM32 и ПК через USB virtual COM port

Давайте рассмотрим достаточно типовую на сегодняшний день задачу: есть ПК, есть какое-то внешнее «железо» на базе микроконтроллера с USB, необходимо наладить обмен данными. Рассмотрим решение этой задачи, несколько уточнив требования:

  • работать будем через virtual COM port на базе USB;
  • среда программирования Visual Studio;
  • язык C#,

причем требования к аппаратной составляющей и вопросы программирования микроконтроллера STM32F102 освещены в статье-симбионте «Использование USB в STM32 на примере Virtual COM port», а здесь мы рассмотрим только разработку ПО для ПК.


Итак, с точки зрения программы для ПК, у вас в системе при подключении USB-устройства просто появляется новый COM-порт (как это сделать, смотрите в вышеназванной статье). На том конце COM-порта — электронное устройство, которому необходимо передать массив данных (например, пользовательские настройки или калибровочные данные). Кроме того, необходимо эти данные еще и читать (например, для сверки двух наборов калибровочных данных — записанных в устройство и заданных через пользовательский интерфейс), и хранить в виде файла на жестком диске ПК (дабы не вбивать данные через пользовательский интерфейс при каждом перезапуске программы).

Чтобы не опираться на совсем уж невидимые абстракции, давайте создадим минимальный интерфейс пользователя, для, скажем, самодельной GSM-сигнализации. Внешний вид программы показан ниже.

 

Давайте попробуем написать немного кода. Для начала создадим структуру данных для хранения всей той информации, которую пользователь может ввести через визуальный интерфейс:

После этого уточняем формат полей, инициализированных как public byte[,], место под которые компилятором выделено, но подробности реализации пока не известны:

Предположим, пользователь ввел данные в необходимые поля и хочет отправить пакет данных через COM-порт. Памятуя о том, что кроме передачи внешнему контроллеру, у нас должна быть еще запись введенной информации на жесткий диск, лучше выделить операцию преобразования в отдельную функцию:

Обратная операция будет выглядеть примерно так:

Операции записи на диск и чтения с диска будут, соответственно, выглядеть как:

Ну и наконец, обмен с внешним «железом» через COM-порт:

Добавить комментарий