Usb serial adapter что это
Некоторое время назад мне в очередной раз потребовался USB-Serial адаптер. И не просто адаптер c RX/TX, а чтобы еще присутствовали управляющие сигналы. И не один UART, а несколько. И еще желательно, в виде одного композитного устройства, чтобы все это хозяйство не занимало больше одного USB-порта. Так и началась эта история.
Готовые устройства из тех, что можно приобрести в магазине, меня не вдохновили. Либо дорого и сложно найти в продаже, либо не подходят по одному или нескольким критериям выше. Композитных USB-Serial адаптеров в дешевом сегменте я и вовсе не смог найти. Зато на столе обнаружилась отладочная плата STM32 Blue Pill на микроконтроллере STM32F103C8T6. Сверившись с документацией, я убедился, что этот микроконтроллер содержит в себе все, что мне нужно для полного счастья. А именно: интерфейс USB 2.0 full-speed, три USART, семиканальный DMA контроллер и достаточное количество линий GPIO для реализации всех интересующих меня управляющих сигналов.
Осталось только раздобыть соответствующую прошивку, которая превратит безжизненный кусок железа в нужное и полезное устройство. И тут меня поджидало большое разочарование: оказывается, несмотря на бешеную популярность этого микроконтроллера и отладочной платы, никто до сих пор так и не сделал ничего подобного. Вернее, попытка была, но это скорее экспериментально-образовательный proof-of-concept, а не законченный продукт. Чего только стоит блокирующая передача данных по UART: один порт передает, остальные ждут. Нет, этот микроконтроллер определенно заслуживает большего! Пришлось засучить рукава и написать прошивку самому.
Зачем?
Нужно это бывает когда некий специальный аппаратный комплекс, состоящий из отдельных устройств и который выполняет какую-то единый функционал, вдруг начинают модифицировать. Разумеется что можно попробовать найти комплекс оборудования по новее, но в реальной жизнь на это идут очень редко. Начинают модифицировать то что есть. Иногда вдумчиво, но чаще как получится.
Как правило «мозгами» такого комплекса является компьютер у которого 100500 выходов RS232. Из примеров могу привести место кассира в супермаркете, банкоматы и тому подобное. С первым случаем столкнулся я.
Эти компьютеры не блещут мощностью, но отличаются космической стоимостью. Естественно он перестает отвечать требованиям современных технологий и многим приходит в голову идея заменить их на обычный ПК и получить приличную мощность по адекватной цене, однако быстро выясняется что RS232 на новых ПК вымер как класс. Теперь этот интерфейс стал сугубо специализированным. Соответственно надо или самостоятельно прикручивать кучу RS232 или искать уже готовое спец решение.
Разумеется что можно заменить само оборудование, но если вы посмотрите сколько стоит стационарный лазерный сканер приличной фирмы и помножите эту цену на их количество то передумаете.
Люди не посвященный в тему сразу радостно покупают пучок китайских USBtoRS232 переходников, а дальше все идет очень печально. Лучше этого не делать. Вторым вариантом является покупка специализированной платы расширения с кучей RS232. Этот вариант уже лучше и имеет право на жизнь, но тоже имеет свои недостатки. Например стоимость и проблемы с дровами если используется не Windows или не та версия. Так же не маловажным фактором является доступность в будущем, так как что-то выходит из строя и парк может расширятся в будущем. Потом оказывается что конкретная модель уже не выпускается или не постановляется в конкретную местность и т.д. В общем привязывать себя к конкретному устройству это всегда опасно, особенно если можно этого не делать.
Зачем нужен драйвер?
При подключении любого устройства к USB-порту компьютера необходимо подсказать операционной системе, как с ним общаться. На стороне компьютера таким переводчиком является специальная программа, называемая драйвером. Например, драйвер преобразователя USB-UART работает в режиме эмуляции последовательного COM-порта. Т. е. при подключении вашей платы к компьютеру чип моста с помощью драйвера попросит операционную систему открыть виртуальный COM-порт, через который начнётся общение между платой и ПК.
Каждый производитель делает свои чипы с соответствующими драйверами. К сожалению, не все драйверы предустановлены в операционных системах по умолчанию. Когда нужного драйвера нет, ОС пытается найти его для нового подключённого устройства, не находит, и вместо виртуального COM-порта вы видите надпись «USB 2.0 SERIAL» или «Неизвестное устройство». Для решения проблемы скачайте и установите драйвер для вашей операционной системы.
High level
Вторая часть софта это примеры и тесты собранные в сумбурный проект на Java написанный IDE IDEA. Предполагается что работа с устройством интегрируется в софт высокого уровня используя различные обертки по работе с USB стеком в зависимости от языка на кортом этот софт пишется. Сейчас сложно найти такой ЯП чтобы под него не существовало таких оберток. Отдельно для староверов отмечу что java и usb совместимы если готовить правельно, это доказано практикой и используется в коммерческом проекте.
В процессе тестирования выяснилось что работа в Linux и Windows с USB HID несколько отличается, работа отлаживалась через две библиотеки usb4java и hid4java. Работа через последнюю используется в Linux (Raspberry Pi 3).
Как и обещал не растягиваю статью и не привожу подробное описание кода, те пару человек кому интересно могут посмотреть проекты и поиграться в живую, а остальным думаю будет полезнее принять к сведению что есть такое решение и прибегнуть к более глубокому изучению в случае необходимости.
Что у меня получилось
Я решил по-максимуму задействовать возможности периферии микроконтроллера, но вместе с тем не впадать в пучину предварительных оптимизаций. Читаемость и поддерживаемость кода для меня гораздо важнее, чем незначительный прирост производительности. Тем более, что с производительностью и так все вышло очень хорошо.
Командный интерпретатор позволяет настраивать следующие параметры:
- тип выхода: двухтактный, открытый сток;
- тип подтяжки входных линий: вверх, вниз, плавающая;
- инверсия для управляющих сигналов: активный высокий/низкий;
Командный интерпретатор активируется на первом CDC порту при подключении пина PB5 к земле, поддерживает часть управляющих последовательностей ANSI (стрелочки, backspace), и принимает вполне дружелюбные на вид команды:
Командный интерпретатор не позволяет переназначать сигналы с одних пинов на другие. Во-первых, далеко не все сигналы можно переназначить, а во-вторых, такая возможность по-настоящему становится востребованной только при использовании прошивки в контексте какой-либо иной платы. В этом случае проще и правильнее переназначить сигналы используя конфигурацию, хранящуюся в исходном коде.
Распиновка вышла следующей:
Signal | Direction | UART1 | UART2 | UART3 |
---|---|---|---|---|
RX | IN | PA10 | PA3 | PB11 |
TX | OUT | PA9 | PA2 | PB10 |
RTS | OUT | N/A | PA1 | PB14 |
CTS | IN | N/A | PA0 | PB13 |
DSR | IN | PB7 | PB4 | PB6 |
DTR | OUT | PA4 | PA5 | PA6 |
DCD | IN | PB15 | PB8 | PB9 |
RI | IN | PB3 | PB12 | PA8 |
TXA | OUT | PB0 | PB1 | PA7 |
Пины, выделенные жирным шрифтом, являются толерантными к 5 В.
Сигнал TXA (TX Active) служит для управления микросхемами трансиверов RS-485 (DE, /RE). TXA активен во время передачи данных и переключается в неактивное состояние не более чем за 0.6 мкс после завершения передачи. Это соответствует спецификациям RS-485 на скоростях до 920 кБод c почти двукратным запасом по времени переключения.
К сожалению, реализовать RTS/CTS на UART1 не вышло из-за того, что соответсвующие пины заняты сигналами USB. Можно было вывести RTS на какой-нибудь другой пин, поскольку RTS управляется программно, в зависимости от степени заполнения кольцевых буферов на прием, но порт c RTS и без CTS мне показался странной штукой и я решил, что так делать не надо.
Проект написан на языке C, и подразумевает использование arm-none-eabi-gcc для сборки. Я использовал специфичный для GCC синтаксис атрибутов и расширения языка С. Совместимость проекта с проприетарными компиляторами меня не интересует, но если кто-то считает это важным, то я готов принять соответствующий пул-реквест.
В результате у меня получилось удобное и мощное устройство которое полностью закрывает все мои потребности в последовательных портах. STM32 Blue Pill можно использовать как самостоятельно, так и в составе схем обеспечивающих согласование уровней и развязку. Возможность настройки сигнальных линий позволяет упростить разработку таких схем.
Подробная документация, исходный код и собранная прошивка доступна в репозитории проекта на GitHub.
Low Level
Код для микроконтроллера я писал и отлаживал с помощью IDE EmBitz (если честно то я был удивлен как легко завелась эта IDE, особенно после танцев с бубном вокруг CooCox. ). За основу взял проект из статьи выше. Это первый пример который у меня заработал сразу после заливки.
Я добавил работу с тремя UART и изменил структуру HID репортов так чтобы обмен с ПК шел всегда по 64 байта с контрольной суммой (crc8).
Попытался организовать автопереподключение устройства если соединение по USB не прошло корректно. Не претендую на супер алгоритм, должен признать что не являюсь специалистом по USB. Отдельный транзистор, отображенный на схеме, управляемый отдельным пином B5 подтягивает одну из сигнальных линий USB к питанию что имитирует включение устройства и хост проводит инициализацию устройства. Если попытка не удачная то происходит переподключение.
Было замечено что в Linux (Raspbian) процент не успешных подключений значительно меньше чем в Win 10, возможно этот результат получился из-за моих локальных технических условий.
Общий алгоритм похож на примитивный маршрутизатор, принимая пакет по USB мы смотрим какому UART оно предназначено и пересылаем туда, в обратную сторону аналогично. Есть немного обработки самих пакетов но это относится к конкретному RS232 оборудованию которое я подключал. Это были: экран покупателя Datecs dpd-201, стационарный лазерный сканер штрихкодов Datalogic Magellan 8300 и весы Digi DS890.
На фото выше тестовый образец устройства содержит еще DC-DC шим преобразователь питания на микросхеме MP2307.
Это нужно для того чтобы питать устройство от напряжения 10-24В (входное) и иметь возможность подключить дисплей покупателя который питается от такого же напряжения. После DC-DC шим преобразователя поулчаем 3.3В для всех остальных модулей. Для этого дисплея так же установлен «телефонный» разъем вместо RS232, не хотелось перепаивать стоковый штекер.
Устранил ошибку, приводящую к возможному повреждению данных на приеме
Код не проверял готовность BULK IN endpoint перед отправкой CDC ZLP-пакетов. При определенных условиях это могло приводить к повреждению принимаемых данных. Очень странно, но эта ошибка в реальной жизни проявлялась существенно реже, чем можно было бы ожидать. Исправлено в версии 2.1.1.
Список поддерживаемых плат
Обновления
Пробуем что-то сделать
Может показаться странным что примитивные RS232 устройства так сложно и дорого подключить по нормальному если по сути там обычно простые протоколы и примитивный физический уровень. А все потому что обычно подобные аппаратные комплексы используются в коммерческих доходных сферах и покупка оборудования по таким ценам оправдана, а само оборудование уже перешло в разряд специального. Спец оборудование = спец цена вопроса.
Однако все это не мешает попробовать собрать свой бюджетный велосипед. Бонусом получим возможность менять поведение такого своеобразного RS232 мультиплексора и полностью обойдем проблему написания USB драйверов. HID профиль поддерживается почти везде.
Однажды я прочел отличную статью автора RaJa До этого я интересовался USB, но до практики не доходило. В наличии у меня было несколько дешевых отладочных плат, китайских клонов Blue Pill на микроконтроллере Stm32f103c8t6. Сама история и идея создания этой платы очень интересная, стоит поинтересоваться.
Этот микроконтроллер отличается тем что имеет три UART и аппаратную поддержку USB. Это то что может быть нам интересно в разрезе нашей задумки, а вообще микроконтроллер на этой плате, работает на частоте 72Mhz и по характеристикам порвет любое Arduino схожего формфактора. Но самое главное преимущество это повсеместная распространенность этой платы. Я не знаю более простых и дешевых способов пощупать «железный» USB.
Добавив три дешевых преобразователя RS232toUART MAX2323 и немного «рассыпухи» можно собрать своеобразный конвертер интерфейса 3хRS232 USB.
В моем случае нужно было подключить три RS232 устройства к Raspberry Pi 3. Если использовать обычные RS232 USB переходники то в итоге сталкиваешься с тем что в системе куча одинаковых устройств к которым не понятно что подключено и все это дико глючит, а выглядит еще более печально.
Если вы немного капнете в сторону какие микросхемы USB to UART доступны повсеместно, то обнаружите что там полно подделок. Думаю не стоит объяснять как это все потом себя ведет с оригинальными драйверами. И никто не сможет гарантировать вам что даже брендовые переходники вдруг не закупят левую партию микросхем. Удешевление производства оно происходит повсеместно.
В итоге придумалась примерно такая простая схема коммутации ее даже можно изобразить в стиле Arduino:
Я отломал резистор который подтягивает D+ к питанию и сделал эту подтяжку управляемой с помощью транзистора. Она отвечает за опознание устройства на USB шине.
Распиновка разъемов RS232 в программе (Fritzing) где я набрасывал схему странноватая, но думаю никому не составит труда найти ее в интернете, контакты задействованы как обычно 2,3 и 5. А еще удобнее будет использовать платы конвертера UART to RS232 котором уже присутствует разъем RS232.
Дальнейшие планы
Нет предела совершенству и этот проект – не исключение. В каких-то местах код можно было написать чище, понятнее и эффективнее. Я обязательно этим в какой-то момент займусь. Кроме того, я очень рассчитываю на обратную связь от пользователей для поиска и устранения возможных багов.
Поддержка RI
Добавил поддержку сигнала RI на всех портах (спасибо plyatov), добавил в статью описание сигнала RI.
Заключение
Представленное устройство это лишь одни из примеров как довольно легко можно приобщится к процессу создания нативных USB устройств и перестать наконец использовать переходники.
Не забываем плюсовать RaJa автора статью в которых на пальцах объясняется как пощупать железный USB и сохранить желание разбираться дальше.
Дешевые USB-COM: расстановка точек над i. Расчлененка. Осциллограммы. Тестирование в реальных условиях.
Как-то потребовалось максимально бюджетно организовать прием факсов в небольшом офисе. Для этого с антресолей был извлечен факс-модем ZyXEL Omni 56K, а поскольку в современных компьютерах порт RS-232 давно канул в лету, на БиКе было решено приобрести адаптер USB-COM. Изучение предложений привело к решению купить все четыре имеющиеся в продаже на тот момент разновидности, благо итоговая стоимость получалась порядка 11 USD.
Итого по получении из пакета были извлечены (слева направо в порядке возрастания цены):
Самый дешевый экземпляр обзора. Выглядит хлипко, плата из корпуса вытаскивается невооруженными руками.
Вместо корпусного чипа просто «капля» на текстолите. Флюс не отмыт.
Идентификатор устройства — VID_1A86&PID_7523, на диске и в интернете наличествуют драйверы под современные 32- и 64-битные операционные системы от Microsoft. После установки драйверов идентифицируется как USB_SERIAL CH340.
Backtrack linux тоже в курсе о его существовании:
Подключенный осциллограф показал, что выходы RTS и DTR выдают в качестве логической единицы +5В, в качестве логического нуля 0В, то есть никакой не RS-232, а самый что ни на есть незамутненный TTL. То же самое относится к выводу TXD.
В режиме простоя.
В режиме передачи данных. Здесь и далее на всех осциллограммах скорость порта 9600 бод, 8 бит посылка, 1 стоп-бит, нет контроля четности. Развертка — 1 мс/деление, чувствительность — 5 вольт/деление (делитель в щупе установлен в положение 1:10).
В порт выводится одно и то же слово. Первому, кто его назовет — плюс в карму.
2. «Прозрачный».
В отличие от предыдущего не разбирается вообще. Но сквозь прозрачную пластмассу видна такая же «капля», да и определяется в системе с тем же VID-PID. Не удивительно, что и логические уровни оказались такие же.
3. «Черный». Опознался при включении как VID_067B&PID_2303.
Самый свежий драйвер, скачанный с сайта Prolific, завелся с полтыка, что позволяет сделать вывод, что чип — либо оригинальный Prolific, либо поздний клон, не опознающийся драйвером как контрафактный.
На обратной стороне нашлась микросхема-преобразователь уровней SP3243ECA.
Уровень в режиме простоя:
В режиме передачи данных:
Тот же VID_067B&PID_2303. Так же заработал с последним драйвером.
Чип преобразователя уровней — MAX211CAI.
Уровень в режиме простоя:
В режиме передачи данных:
Тестирование работоспособности с реальными устройствами.
Устройство №1: спутниковый ресивер Dreambox 500S.
Параметры подключения: 115200 8N1.
Адаптеры на CH340 выдают в консоль мусор:
Адаптеры на PL2303 работают корректно:
Устройство №2: тот самый ZyXEL Omni 56K
Параметры подключения: 57600 8N1.
Все 4 адаптера подключились успешно.
.
Устройство №3: маршрутизатор Cisco 2801.
Параметры подключения: 9600 8N1.
Все 4 адаптера подключились успешно.
Устройство №4: офисная АТС Nortel Meridian 11C.
Параметры подключения: 9600 8N1
Все 4 адаптера подключились успешно.
Устройство №5: попытаемся прочесть EEPROMы 24Cxx и 93Cxx программатором PonyProg.
Как известно, программа PonyProg2000 позволяет читать и писать большое количество последовательных флэшек и микроконтроллеров, используя последовательный порт компьютера в качестве интерфейса. Отличие от предыдущих испытаний в том, что собственно выводы приема и передачи данных нам понадобятся постольку поскольку. Для программирования используется режим Bit-Banging — имитация сигналов интерфейса методом «дрыгания» в нужном порядке выводов GPIO (DTR, DST, CTS, RTS). На многих форумах электронщиков утверждается, что USB-COM преобразователь для этих целей непригоден вообще. Что мы сейчас и проверим.
Сдуваем SPD-чип со старой планки памяти. Это и есть EEPROM 24С02.
Панельки-переходника с SOIC на DIP у меня нету, поэтому подпаиваю по проводу к каждой ноге.
Сигналы порта уходят на ноги чипа через резисторы 4.7к и «подперты» стабилитронами 5.1В согласно схеме.
Общая часть программатора.
Переходник для I2C.
Переходник для Microwire.
Подаем 5В от USB, запускаем программу, выбираем чип, нажимаем кнопку «Прочитать».
Вот оно, содержимое:
Флэшка прочлась, но очень-очень медленно. На несчастные 256 байт понадобилось порядка 30 секунд. Страшно представить, сколько будет читать флэшка размером хотя бы 1 мегабайт.
Тем не менее, констатируем, что прочесть 24Cxx удалось.
Теперь попробуем прочесть EEPROM с интерфейсом Microwire.
Выдергиваем 93C46 из панельки на старой сетевой плате:
Вставляем в макетку и обвязываем резисторами-стабилитронами согласно схеме.
Нажимаем кнопку «Прочитать».
В ответ получаем нули:
Неужели флэшка пустая? Подключаем стенд к порту на материнской плате, читаем.
Нет, не пустая. В чем же дело? Подключаем логический анализатор и смотрим обмен.
Кроме ужасающей разницы в периодах следования импульсов видим, что аппаратный порт дрыгает ногой сброса (канал №3), а USB-COM не хочет. Эта нога управляется сигналом TXD порта. Как его разработчики Ponyprog умудрились сделать постоянно высоким, я не знаю. Возможно, это недокументированная возможность именно «аппаратного» порта. Напишите в комментариях, если кто в курсе.
Констатируем: прочитать 93Cxx не удалось.
Субъективные выводы: с модемом оставлю работать «бесхвостого», ибо если нет разницы, то зачем платить больше. «Прозрачного» и «черного» положу рядом в резерв, так как «капли» по моим наблюдениям долго не живут. В сумку с инструментами брошу «серого» как имеющего максимальные уровни.
USB/UART конвертеры, такие маленькие платки подключаемые к USB, повсеместно используются радиолюбителями для программирования микроконтроллеров, подключения различных устройств, модемов, модулей, всего, в описании чего есть слова SERIAL или UART.
Я уже делал обзор на подобную плату с CP2102. Но периодически эти платки сгорают или теряются или просто оседают в недрах очередной поделки. И заказывая очередную партию плат Arduino Pro Mini, до кучи взял USB/UART на CH340. Данная плата меня заинтересовала тем, что имеет вывод DTR, который я раньше видел только на платах с CH2103. А это значит, что Arduino Pro Mini можно программировать без мучительных нажатий на кнопку RESET.
CH340 от китайской компании WCH отличаются дешевизной. Их ставят как в отдельные модули, так в китайские клоны Arduino, отладочные платы ESP8266. Даташит на CH340
Ну что, ж, посмотрим что же я купил. В прозрачном пакетике сам модуль и соединительный провод на 5 проводов.
На плате, кроме «GND», «VCC», «TX» и «RX» есть еще «DTR» и «CTS». У последнего, «пина приветсвия» я так и не понял назначение, так как сигнала на нем нет никакого (Может кто посветит, зачем он здесь?".
На плате имеется переключатель питания 5В (напрямую с USB) и 3.3 с маломощного стабилизатора (заявлено 120мА)
и кнопка, при нажатии на которую происходит отключения питания на VCC/. Этой кнопкой можно передергивать устройства, у которых отсутствует RESET.
Из за дополнительных кнопок плата немного больше чем другие аналогичные модули
К сожалению, переключатель 5/3.3В работает только на VCC и не переключает TTL уровень UART интерфейса. Большинство устройств с 3-х вольтовым питанием толерантно к уровням 5В, но если такое не заявлено, нужно будет использовать преобразователь логических уровней или самодельную опторазвязку.
Напряжение VCC при разных положения переключателя
Подключаю Arduino Pro Mini и без проблем программирую его без всяких нажатий на RESET
В моей Windows 7 64 бит драйвера на CH340 уже были. Не удивительно, учитывая сколько устройств к нему уж подключалось.
LINUX из моей «апельсинки» определил эти платки «из коробки»
Логический анализатор, подключенный в параллель TX, RX и DTR показывает работу последнего
А вот с модулем ESP8266 без внешнего питания ничего не вышло. ESP-шка просадила маломощный стабилизатор до 1.6В и работать отказалась
Поддержка управления трансиверами RS-485
Добавил поддержку управления трансиверами RS-485 в версии 2.2.0, обновил статью, добавил описание сигнала TXA. Спасибо dernuss и остальным тем, кто просил сделать эту фичу.
При подключении платформ разработки на базе Arduino к компьютеру, вы связываете между собой два мира: микроконтроллерный и микропроцессорный.
Стандартным интерфейсом плат Arduino на микроконтроллерах ATmega328P является UART, а у современных компьютеров используется USB. Чип USB-UART CH340G служит мостом между микроконтроллером и USB-портом компьютера, который позволяет загружать прошивку в плату, а также передавать между собой данные.
Установка драйвера
Рассмотрим установку драйвера на примере платы Iskra Uno в операционной системе Windows. С остальными платами ситуация будет аналогичная.
Подключите плату к компьютеру по USB. Для коммуникации используйте кабель USB (A — B).
Скачайте и установите драйвер CH340 для Windows.
Если во вкладке отображается пункт USB-SERIAL CH340 (COMx) — значит, всё получилось, и можно переходить к прошивке платформы.
Если пункта не обнаружено или вкладка «Порты (COM и LPT)» вовсе отсутствует, следуйте дальнейшей инструкции.
В диспетчере устройств Windows раскройте вкладку «Другие устройства» и найдите пункт USB2.0-Serial .
Далее кликните правой кнопкой мыши по пункту USB 2.0 Serial и выберите раздел «обновить драйвер».
Выберите пункт «Выполнить поиск драйверов на этом компьютере».
Укажите путь к директории драйвера и нажмите кнопку «установить». В нашем случае: C: Program Files (х86) Arduino drivers
Откройте повторно вкладку «Порты (COM и LPT)» в диспетчере устройств. Если там отображается пункт USB-SERIAL CH340 (COMx) — значит, всё получилось, и теперь можно переходить к прошивке платформы.
Как обычно я предлагаю заняться странным — попробовать подключить несколько старых RS232 устройств, через один USB порт с помощью синей изоленты и смекалки. Статья не будет большой, скорее это описание что где взять и зачем вообще все это делать.
Читайте также: