Связь по USB Serial
В этом разделе мы настроим обмен данными между нашим устройством (Pico) и компьютером под управлением Linux. Мы отправим простую строку с Pico на компьютер, а также передадим ввод с компьютера обратно на Pico.
Это особенно полезно, когда у вас нет отладочного зонда и вы хотите выводить показания датчиков или сообщения о состоянии в системную консоль, чтобы быстро понять, что происходит. Я сам много раз пользовался этим подходом, ещё до того как купил отладочный зонд.
Tip
Если у вас есть отладочный зонд, эту главу можно пока пропустить. К ней всегда можно вернуться позже, когда понадобится обмениваться данными с компьютером по USB, например отправлять сообщения, читать ввод или строить простые интерфейсы на командах.
CDC ACM
Когда вы подключаете USB-устройство к компьютеру, компьютеру нужно знать, что это за устройство и как с ним общаться. USB решает эту задачу, определяя стандартные типы устройств, которые называются классами.
CDC расшифровывается как Communication Device Class (класс коммуникационных устройств). Это класс USB для устройств, которые обмениваются данными, отправляя и принимая их, похоже на последовательную связь. Один из очень распространённых типов CDC называется ACM, что означает Abstract Control Model (абстрактная модель управления).
CDC ACM делает USB-устройство похожим на простой последовательный порт для компьютера.
Поэтому, хотя данные передаются по USB, операционная система воспринимает их как обычное последовательное соединение. В Linux именно поэтому устройство появляется как что-то вроде /dev/ttyACM0.
Если вы когда-либо использовали UART через USB-адаптер для последовательного порта, со стороны программного обеспечения это ощущается почти так же.
Инструменты для Linux
Когда вы прошьёте код из этого упражнения, устройство появится на компьютере как /dev/ttyACM0. Для работы с последовательным портом USB в Linux можно использовать такие инструменты, как minicom, tio (или cat), чтобы читать и отправлять данные на устройство и с него
- minicom: текстовая программа для связи через последовательный порт. Она используется для общения с внешними устройствами RS-232, например мобильными телефонами, маршрутизаторами и консольными портами.
- tio: инструмент для работы с последовательными устройствами, с простым интерфейсом командной строки и файлом конфигурации, который позволяет легко подключаться к последовательным TTY-устройствам для базового ввода-вывода.
Крейты Rust
Мы будем использовать пример из репозитория RP-HAL. Он использует два крейта: usb-device, стек USB для встраиваемых устройств на Rust, и usbd-serial, который реализует класс последовательного порта USB CDC-ACM. Класс SerialPort в usbd-serial реализует буферизованный последовательный порт с потоковым интерфейсом и может использоваться почти так же, как UART.
Ссылки
- CDC: Communication Device Class (ACM) (на английском языке)
- USB Device CDC ACM Class (на английском языке)
- В чём разница между /dev/ttyUSB и /dev/ttyACM? (на английском языке)
- Defined Class Codes (на английском языке)