Встречаю очень многие устройства (да по сути 100% в интересующей меня нише), у которых USB-выход и через этот выход идёт UART over USB. Причём, насколько я могу судить, он идёт прямо из микроконтроллера.
Выходит следующая схема: в микроконтроллере программируют код по переводу последовательности байтов в этот квази-стандартный протокол, который потом через USB отправляется на целевой компьютер. В целевом компьютере эти байты дешифровываются и ими пользуются.
Протокол там непростой и не тривиальный,
тут, к примеру, есть неполная реализация этого протокола на Java для андроид.
При этом, опять же в 100% случаев поверх этого потокового протокола делают сообщения, с границами и прочим.
Насколько я понял, в "чистом" USB уже есть запросы и ответы. Единственный нюанс — хост всегда должен запрашивать девайс, но это в любом случае происходит.
Т.е. я просто не понимаю — зачем всё это усложнение, если можно выкинуть пару слоёв, кучу кода и работать с USB "напрямую". Для работы с USB, например в андроиде и в браузере есть API, а для UART в андроиде нет. Для нативного кода есть годами отлаженная libusb.
Я глубоко пока в это не погрузился, поэтому может чего не понимаю?