Встречаю очень многие устройства (да по сути 100% в интересующей меня нише), у которых USB-выход и через этот выход идёт UART over USB. Причём, насколько я могу судить, он идёт прямо из микроконтроллера.
Выходит следующая схема: в микроконтроллере программируют код по переводу последовательности байтов в этот квази-стандартный протокол, который потом через USB отправляется на целевой компьютер. В целевом компьютере эти байты дешифровываются и ими пользуются.
Протокол там непростой и не тривиальный, тут, к примеру, есть неполная реализация этого протокола на Java для андроид.
При этом, опять же в 100% случаев поверх этого потокового протокола делают сообщения, с границами и прочим.
Насколько я понял, в "чистом" USB уже есть запросы и ответы. Единственный нюанс — хост всегда должен запрашивать девайс, но это в любом случае происходит.
Т.е. я просто не понимаю — зачем всё это усложнение, если можно выкинуть пару слоёв, кучу кода и работать с USB "напрямую". Для работы с USB, например в андроиде и в браузере есть API, а для UART в андроиде нет. Для нативного кода есть годами отлаженная libusb.
Я глубоко пока в это не погрузился, поэтому может чего не понимаю?
Здравствуйте, vsb, Вы писали:
vsb>зачем всё это усложнение
Затем же, зачем и I2C, TCP/IP и прочие протоколы — ради стандартизации. Есть хренова гора аппаратных интерфейсов на базе UART, есть хренова гора софта для работы с ним, а вот софта, работающего напрямую с USB, на порядки меньше.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>зачем всё это усложнение
ЕМ>Затем же, зачем и I2C, TCP/IP и прочие протоколы — ради стандартизации. Есть хренова гора аппаратных интерфейсов на базе UART, есть хренова гора софта для работы с ним, а вот софта, работающего напрямую с USB, на порядки меньше.
Речь о том, когда нет никаких аппаратных интерфейсов, обмен идёт от USB к USB. На устройстве USB и на компьютере USB.
Здравствуйте, vsb, Вы писали:
vsb>Речь о том, когда нет никаких аппаратных интерфейсов, обмен идёт от USB к USB.
Если это устройство, существующее в виде единственной модели, ни на что не похожее, и программа, работающая только в одной ОС, только с этим устройством, никуда не переносимая, и ни к чему другому не применимая, то, возможно, это делали из каких-то особых соображений.
Если же оно переносимо, допускает стыковку с разными типами хостов и т.п., то средства работы с UART в разных ОС для разного железа гораздо более схожи, чем средства работы с USB.
Здравствуйте, vsb, Вы писали:
vsb>Встречаю очень многие устройства (да по сути 100% в интересующей меня нише), у которых USB-выход и через этот выход идёт UART over USB. Причём, насколько я могу судить, он идёт прямо из микроконтроллера.
У этих устройств не было предыдущих версии с UART без USB, в которых этот протокол уже был реализован?
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Речь о том, когда нет никаких аппаратных интерфейсов, обмен идёт от USB к USB.
ЕМ>Если это устройство, существующее в виде единственной модели, ни на что не похожее, и программа, работающая только в одной ОС, только с этим устройством, никуда не переносимая, и ни к чему другому не применимая, то, возможно, это делали из каких-то особых соображений.
Это не одно устройство, это куча устройств схожего типа от разных производителей. Возможно часть этих устройств имела предыдущие версии без USB, тут не знаю. Программы от этих производителей единственные, только под Windows, никакой переносимости или стандартизации не предполагающие.
Здравствуйте, vsb, Вы писали:
vsb>Программы от этих производителей единственные, только под Windows
В Windows никогда не было родных высокоуровневых API для работы с USB — только универсальный DeviceIoControl для взаимодействия с любым драйвером ядра. Для устройств известных классов (HID, Mass Storage, Audio и т.п.) есть стандартные драйверы с известными интерфейсами, а все остальное требует собственных ядерных драйверов. Разработка ядерного драйвера под Windows, который будет работать эффективно, надежно, и никому не мешать — задача не совсем тривиальная, плюс с 2015-го действует жесткая политика подписывания.
Адаптеров USB/UART есть несколько разных, для каждого есть готовый драйвер, API со стороны системы стандартный и достаточно удобный, поэтому куда проще сделать устройство, подключаемое к UART, чем каждый раз городить всю обвязку заново.
vsb>Выходит следующая схема: в микроконтроллере программируют код по переводу последовательности байтов в этот квази-стандартный протокол, который потом через USB отправляется на целевой компьютер. В целевом компьютере эти байты дешифровываются и ими пользуются.
Ну не совсем, где то может и делают так, но на то, чтобы полноценный usb потянуть, у слабых микроконтроллеров силёнок маловато. Я чаще видел спецчип usb uart bridge типа ft232 или cp2102.
Таким образом получается слабый МК, который usb ну никак сам не осилит, но при этом удобно к компу подключать, да и драйверы стандартные.
Да и сразу в МК такой чип тоже имеет смысл встроить, удобно же.
Здравствуйте, vsb, Вы писали:
vsb>Встречаю очень многие устройства (да по сути 100% в интересующей меня нише), у которых USB-выход и через этот выход идёт UART over USB. Причём, насколько я могу судить, он идёт прямо из микроконтроллера. vsb>Я глубоко пока в это не погрузился, поэтому может чего не понимаю?
Так значительно проще и дешевле.
Здравствуйте, LuciferSaratov, Вы писали:
LS>Ну не совсем, где то может и делают так, но на то, чтобы полноценный usb потянуть, у слабых микроконтроллеров силёнок маловато.
Почему? Вот сейчас у меня довольно слабый МК STM32F103. Стоит меньше доллара оптом, насколько я знаю. 20 КБ SRAM, 64 КБ флеша. USB умеет.
Я, если что, говорю об устройствах, которые в рознице продаются за тысячи долларов. И там цена этого МК много роли не играет.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Программы от этих производителей единственные, только под Windows
ЕМ>В Windows никогда не было родных высокоуровневых API для работы с USB — только универсальный DeviceIoControl для взаимодействия с любым драйвером ядра. Для устройств известных классов (HID, Mass Storage, Audio и т.п.) есть стандартные драйверы с известными интерфейсами, а все остальное требует собственных ядерных драйверов. Разработка ядерного драйвера под Windows, который будет работать эффективно, надежно, и никому не мешать — задача не совсем тривиальная, плюс с 2015-го действует жесткая политика подписывания.
Звучит странно. Как тогда браузер может с USB работать? Не припоминаю, чтобы хром какие-то драйверы мне устанавливал.
Здравствуйте, vsb, Вы писали:
vsb>Протокол там непростой и не тривиальный, тут, к примеру, есть неполная реализация этого протокола на Java для андроид.
Здравствуйте, cppguard, Вы писали:
vsb>>Протокол там непростой и не тривиальный, тут, к примеру, есть неполная реализация этого протокола на Java для андроид.
C>Linux умеет из коробки. Речь про Win/Mac?
Андроид не умеет из коробки. С Win там всё сложно, вообще код драйвера там идёт давным давно, но до последних версий чтобы его активировать, нужно специальный inf-файл установить. Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
Здравствуйте, vsb, Вы писали:
vsb>Андроид не умеет из коробки. С Win там всё сложно, вообще код драйвера там идёт давным давно, но до последних версий чтобы его активировать, нужно специальный inf-файл установить. Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
Здравствуйте, vsb, Вы писали:
vsb>Почему? Вот сейчас у меня довольно слабый МК STM32F103. Стоит меньше доллара оптом, насколько я знаю. 20 КБ SRAM, 64 КБ флеша. USB умеет.
этот умеет, а какой нибудь AVR/PIC или что там ещё не умеет.
в подключении USB-UART то смысл не в том, что вот мы так под USB общаемся, а в том, чтобы UART к компу удобно подключить. первичен тут UART, а не USB.
vsb>Я, если что, говорю об устройствах, которые в рознице продаются за тысячи долларов. И там цена этого МК много роли не играет.
если контроллер мощный и всё умеет, то аппаратный UART очень удобен, например, для отладки ядра ОС.
запустить соединение по USB по своему протоколу требует загруженного ядра и драйверов, а UART доступен, насколько я понимаю, чуть ли не сразу при подаче питания.
навесить поверх UART еще и usb bridge это просто элемент обеспечения удобства подключения к компу.
Здравствуйте, vsb, Вы писали:
vsb>сейчас у меня довольно слабый МК STM32F103.
"Слабый" он на фоне каких-нибудь ARM'ов для телефонов, а на фоне традиционных 8- и 16-разрядных контроллеров, которые преобладают в простых устройствах, он супермощный. Технология-то складывалась "для МК вообще", а не для их продвинутых представителей.
vsb>Я, если что, говорю об устройствах, которые в рознице продаются за тысячи долларов. И там цена этого МК много роли не играет.
Если есть готовая, наработанная технология и железо/софт под нее, и они решают имеющиеся задачи, то какой смысл использовать более сложные и затратные решения?
Здравствуйте, vsb, Вы писали:
vsb>Как тогда браузер может с USB работать?
Вот так просто взять и начать "работать с USB" — никак. Он может использовать WinUSB API, которое есть на уровне Win32, но и оно в общем случае требует поддержки от исполняющей системы языка. Из JS его можно полноценно использовать только при наличии поддержки в самом браузере.
vsb>Не припоминаю, чтобы хром какие-то драйверы мне устанавливал.
Да, есть такое, начиная с семерки (я давно за этим не следил). Но для того, чтобы winusb.sys начал обслуживать устройство, это устройство нужно установить при помощи INF-файла, о чем Вы упоминали. Для этого придется создать CAT-файл и как-то подписать его.
Здравствуйте, vsb, Вы писали:
vsb>до последних версий чтобы его активировать, нужно специальный inf-файл установить.
В любых нужно. Иначе откуда винда догадается, что к этому устройству нужно подключить именно winusb, а не другой драйвер?
vsb>Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
Какое именно устройство заработало? Такое возможно в двух случаях: устройство стало достаточно известным, чтобы MS включила его в стандартные списки, или в этой системе оно уже когда-то устанавливалось, и описание сохранилось.
Здравствуйте, Евгений Музыченко, Вы писали:
vsb>>Толи в 11, то ли в 10, то ли в последних "версиях" 10-ки оно вроде заработало совсем без дополнительных усилий.
ЕМ>Какое именно устройство заработало? Такое возможно в двух случаях: устройство стало достаточно известным, чтобы MS включила его в стандартные списки, или в этой системе оно уже когда-то устанавливалось, и описание сохранилось.
Китайские переходники USB-UART заработали. Я думаю, что они уже давным давно достаточно известны, по крайней мере в линуксе и макоси с этим проблем не припомню.