Tehnik-ast.ru

Электро Техник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Usb в com порт

Usb в com порт

За время существования этого сайта мне довольно часто задают один и тот же вопрос, который можно описать примерно следующим образом:

«У меня в компьютере (ноутбуке) нет LPT порта. Купил себе переходник USB-LPT. Установил. Ваши примеры не работают. Почему?»

В итоге решил описать этот вопрос подробнее и написать статью. Да, действительно, сейчас стационарных PC с LPT портом нужно поискать (т.е. далеко не каждая «мать» сейчас идет в комплекте с LPT портом). Про ноутбуки вообще говорить не приходится. Современные модели LPT порт вообще не применяют. Только очень дорогие и специализированные машины, типа DELL, могут «похвастаться» наличием этого порта.

Также, сейчас в продаже можно свободно приобрести вот такие устройства, называемые LPT-USB переходниками.

Инстркуция гласит что этот прибор полностью совместим с различными принтерами, сканерами и т.д. Подключаем переходник к USB порту, устанавливаем драйвера. Смотрим диспетчер устройств. Скорее всего в ветке «Порты LPT/COM» ни чего не появилось (хотя бывают исключения). Скорее всего повится либо новая ветка со странным устройством с именем, например, LPT1USB либо в разделе USB устройств появится странная запись о «USB устройстве поддержки LPT принтеров». Пробуем запустить какой-нибудь пример из статей выше. И ни тут то было — ни чего не работает. Пробуем адрес порта LPT1 — ни чего не работает. Пробуем адресс порта LPT2. К сожалению, такая модернизация адреса в запросах тоже ни к чему не приводит — светодиоды как не загорались так и не загораются.

Чтобы разобраться в чем тут дело давайте вернемся на время к обычному «родному железному» LPT порту — LPT1, который из материнской платы «торчит». Зайдем в диспетчер устройств, заглянем в свойства нашего порта. Там мы увидим вот такую картину. Отлично видно, что система прописала базовый адрес ввода-вывода 0x378 и запрос на прерывание номер 7. Все правильно.

Теперь погрузимся на уровень программирования. В примерах статей выше мы минуя систему защиты ввода-вывода легальными и нелегальными способами напрямую общались с реально существующим регистром ввода-вывода, которому присвоен адрес 0x378. Тут все понятно. Незабудем также о том, что Windows рекомендует работать с LPT портом используя вызовы API функций — OpenFile(), WriteFile(), ReadFile(). Приложения, которые используют LPT порт для обмена информацией по парралельному интерфейсу с внешними устройствами (принтер, например) так и делает. У него нет задачи установить на каком-либо бите регистра Data лигическую еденицу. Ему (приложению) нужно просто отправить пакет данных, а кто там будет какие линиии при этом «дергать» и считывать его не сильно интересует. Эти операции проводит системный драйвер LPT порта. Он подгружается в память при загрузке ОС. Когда мы вызываем функцию OpenFile(«LPT1», . ) мы по сути дела обращаемся к драйверу порта, который имеет символическое имя LPT1. Драйвер делает кучу всякой работы — запрещает доступ к порту другим процессам, настраивает параметры протокола передачи данных, собственно реализует эту передачу, но в конечном итоге все это сводится к прямому управлению отдельными битами LPT порта на уровне ядра ОС.

А теперь попробуем поработать с нашим переходником USB-LPT. Начнем как не покажется странным, с API вызовов. Запускаем OpenFile(«LPT1USB», . ) (смотря как этот переходник диспетчере устройств назовется, если вообще назовется). Что при этом происходит? Дело в том, что теперь мы будем работать не с драйвером LPT порта ОС а с драйвером этого переходника! Вот в чем фокус то! Он принимает пакет данных от нашего пользовательского приложения и в нужном формате через систмный драйвер USB отсылает этот пакет на USB контроллер, «ноги» которого торчат из внешней LPT розетки на проводе (ну это так, «грубое объяснение»). Видете, здесь нет ни какого намека на обращение к регистрам по адресам 0x378(0x278), т.к. их просто нет!

Поэтому, когда Вы патаетесь запускать примеры данного раздела и обращаться напрямую по адресам 0x378 (если этот «псевдо порт» назвался LPT1USB или что-то в этом духе), 0x278 (LPT2_. ) и т.д. ни чего не происходит. Их просто нет! А вот программа котороая работает через API вызовы ни чего не заметит — вся низкоуровневая работа делается драйвером, а каким драйвером и куда пойдут пакеты данных (в реальный порт ввода-вывода или в USB хост-контроллер) — приложению неважно! Попробуйте открыть свойства «псевдопорта» в диспетчере устройств. Нет вкладки с ресурсами? Есть, но там каие-то неадекватные значения или вкладка деактивировнна? В том то и дело.

ИТОГО: С вероятностью 99% купленный Вами переходник USB-LPT не сможет обеспечить Вам работу на низком уровне с пинами этого порта.

Почему 99%? Потомоу что есть самодельниые USB-LPT переходники, которые определяются Windows как полноценный порт LPT1 и ему присваивается вполне обыденный адрес 0x378. Обращения на прямую к пинам порта проходят успешно! Однако это очень нестандартная конструкция (в первую очередь драйвер, который занимается перехватом обращений по базовому адресау порта LPT1). Все это не очень надежно (обновление ОС — и конструкция теряет работоспосбность) и для использования рекомендовано быть может только с натяжкой.

И что тагда делать?

Как ни покажется странным — решение ЕСТЬ. Вы всегда сможете добавить настоящий LPT порт в свой настольный компьютер или ноутбук. Во-первых, забудте сразу о переходниках с интерфейсом USB. Для решения этой задачи необходимо приробрести PCI-LPT переходник для настольного PC (необходимо наличие свободного PCI слота) или PCMCIA-LPT переходник для ноутбука (см. фото ниже).

Читайте так же:
Какую электробритву лучше выбрать

В случае использования этих устройств ни каких проблем нет. Определяются они как настоящие «родные» LPT порты. Соответствующая запись будет добавлена в диспетчер устройств во вклдаку «LPT/COM порты». Прямое обращение к пинам порта будет работать.

Рекомендации по переходу с RS-232 на USB

Многие приложения используют коммуникационный порт RS-232 для связи между компьютером и внешним устройством.


Рисунок 1 – Исходное приложение

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

Многие из этих преимуществ станут доступными при переключении с RS-232 на USB. Но при этом также целью выполнения данного переключения являются минимальные затраты времени и сил.

Архитектура программного обеспечения

Целью реализации виртуального COM-порта является переход с реальной УАПП-системы к УАПП/USB-системе:

Данная архитектура требует очень немного модификаций.

Со стороны ПК не требуется выполнение каких-либо изменений! Доступ к USB-порту происходит через драйвер COM-порта, поэтому, нет необходимости изменять имеющуюся управляющую программу для компьютера.

Со стороны приложения драйвер УАПП необходимо заменить на драйверы УАПП USB. В этом случае вместо вызова функций УАПП необходимо вызывать УАПП-USB функции.

Класс USB CDC

В данном документе описывается подход для реализации класса коммуникационного устройства (CDC) USB, как ISDN-модемов, виртуальных COM-портов и т.д. Более подробная информация по данному классу может быть найдена на www.usb.org .

  • Модель связи абстрактного управления с одной входной точкой прерывания
  • Абстрактная модель управления данными с одной поточной входящей и одной поточной выходящей конечными точками

Загрузка драйвера CDC под Windows®

Класс CDC поддерживается всеми версиями Windows, начиная с Windows 98SE до Windows XP.

После подключения нового USB-устройства Windows проверяет все имеющиеся INF-файлы для загрузки соответствующего драйвера. INF-файл содержит идентификационные данные о производителе и продукте или определение класса USB. Если идентификационные данные или определение класса USB подключенного USB-устройства совпадает с одним из INF-файлов, то Windows загрузит драйвер описанный в этом файле.

Т.к. Microsoft не поддерживает стандартный INF-файл для CDC-драйвера, то Atmel предоставляет INF-файл, который позволяет загрузить этот драйвер под ОС Windows 2000 и Windows XP. После первого подключения пользователь должен указать данный INF-файл, чтобы операционная система определила какой драйвер необходимо загрузить.

Производители USB-продукции могут указывать собственные идентификационные данные (VID – код производителя и PID – код продукции). Для этого необходимо отредактировать данные значения в самом USB-устройстве(config.h) и в INF-файле (см. пример ниже).

Пример INF-файла

Библиотека УАПП USB

Элементарные функции

uart_usb_test_hit()bit uart_usb_test_hit (void);
Проверяет принятие хотя бы одной кодовой посылки.
uart_usb_getchar()char uart_usb_getchar (void);
Возвращает принятый байт в буфере FIFO конечной точки (OUT), если в буфере FIFO имеется хотя бы один байт. Если в стеке нет данных, то данная функция ожидает получение новых данных через USB-порт.
uart_usb_putchar()char uart_usb_putchar (char);
Записывает байт в буфер FIFO конечной точки (IN). Если данная конечная точка заполняется, то данная функция отправляет весь буфер FIFO главному.
uart_usb_tx_ready()bit uart_usb_tx_ready (void);
Проверяет возможность записи байта в буфер FIFO конечной точки (IN).
uart_usb_flush()bit uart_usb_flush (void);
Если в буфере FIFO конечной точки (IN) имеются данные, то данная функция отправляет их. Использование этой функции предотвращает ожидание заполнения буфера FIFO конечной точки (IN) перед отправлением главному (хосту).

Пример реализации преобразователя USB в RS232

Целью данного примера является реализация очень простого преобразователя USB RS-232:

Прим.: В данном примере не может быть изменена конфигурация УАПП.

Архитектура программы внешнего устройства:

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

Пример передачи сообщения «Hello World»

Если в файле config.h определено HELLO_WORLD_DEMO, то стандартные функции STDIO относятся к USB, а не к УАПП. В программе можно использовать непосредственно функцию “printf()”, например, для записи в USB-порт. Сообщение “HELLO WORLD” непрерывно отправляется, если нажать на кнопку INT0 на демонстрационной плате AT89C5131.

Посылка, отправленная в AT89C5131 через виртуальный COM-порт, отображается на экране.

Распиновка COM порта

Распиновка COM порта-1

Правильная распиновка СOM-порта RS232

Распиновка COM порта — RS232 интерфейс был сконструирован более пятидесяти лет тому назад. А после этого был стандартизирован. В различных периодах усовершенствования технических возможностей компьютеров успешно применялся для подключения к телефонной линии с помощью модема. На данный момент такой интерфейс считается как уже вчерашний день. В основном его невостребованность заключается слишком низким быстродействием. Так как там задействованы линейные сигналы в однофазной форме. То-есть не дифференциальные.

Распиновка COM порта-2

Наружный вид девяти-контактного коннектора RS232

В современных устройствах на смену интерфейсу RS-232 пришел новый, отличающейся существенным быстродействием — USB. Тем не менее, и до настоящего времени их можно встретить в действительности огромное количество в различных аппаратах. Последовательный порт, цоколевка которого описана ниже, очень востребован в изделиях предназначенных для промышленных целей, а также для медицинского оборудования.

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

Характерные особенности порта

Распиновка COM порта-3

Что касается самой контактной колодки интерфейса RS-232 и ее кабельной составляющей, то они собраны на 9-пиновом разъеме D-Sub. Штыревые контакты размещенные в двухрядном варианте, для обеспечения точности подсоединения вилки к разъему, форма колодки имеет несимметричную конструкцию. Все контактные штырьки обозначены номерами, подробнее как делается распиновка COM порта обозначено в приведенной ниже таблице.

Читайте так же:
Как варить инверторным сварочным аппаратом новичкам

Таблица

Номер контактаНазначениеОбозначение
1Активная несущаяDCD
2Прием компьютеромRXD
3Передача компьютеромTXD
4Готовность к обмену со стороны приемникаDTR
5ЗемляGND
6Готовность к обмену со стороны источникаDSR
7Запрос на передачуRTS
8Готовность к передачеCTS
9Сигнал вызоваRI

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

Соединительный кабель

Если нет необходимости задействования все контактной группы, то в таком случае можно использовать обычную витую пару. При этом ее отдельные провода припаиваются к вилке и контактам в колодке разъема. Ввиду ограниченного пространства в самой колодке, в местах пайки провода желательно помещать в кембрик.

Наибольшее расстояние связи относительно стандарта должна быть более 15 метров. Если требуется ее увеличение, тогда для этого нужно использовать экранированный провод.

COM порт — лекция

Usb в com порт

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

COM-порт для Windows

Что делать если в компьютере нет COM-порта?

Изначально COM-порты использовались для подключения терминалов, модемов и мыши. В современное время основное назначение сводится к подключению всевозможных источников питания, микроконтроллеров, вычислительных систем, кассовых аппаратов и других устройств. Также COM-порт очень активно использовался для синхронизации компьютеров: к примеру, ноутбука с персональным компьютером. Сейчас такой подход сменился использованием USB-порта.

Что такое виртуальный COM-порт?

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

Для чего используется?

Поняв, что такое реальный COM-порт и для чего он используется, без труда можно представить себе необходимость в виртуальном COM-порте. Представьте: вам нужно подключить вычислительное устройство к компьютеру через COM-порт. Но у вас его нет! Или же подключить несколько устройств, а порт всего один. Как быть в такой ситуации? Спасает именно создание виртуального порта.

Таким образом, виртуальный порт позволяет имитировать его присутствие в компьютере при отсутствии оного. Примеровприменения довольно много. Однако наиболее часто виртуальный COM-порт применяется:

  • При необходимости подключить несколько устройств одновременно.
  • При необходимости отладить (протестировать, найти ошибки) программу для вычислительного устройства при отсутствии порта.

Как создать виртуальные порты?

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

Скачайте и установите программу Advanced Virtual COM Port. Установка занимает считаные минуты, при этом на одном из этапов нам предложат драйвер:

Программа для настройки виртуального com-порта в windows

Программа для настройки виртуального com-порта в windows

Соглашаемся и нажимаем «Установить». Следует подождать несколько минут — не пугайтесь, если потребуется 5–10 минут. Это нормально.
После установки, заходим в программу и видим главное окно:

Кернел про -для настройки виртуального com-порта в windows

Кернел про -для настройки виртуального com-порта в windows

Оно содержит три основных вкладки: Общие (расширенные), клиентские и локальные порты.

Вкладка общие (или расширенные) порты позволяет делиться COM-портами через локальную сеть (LAN) или интернет. Таким образом, данные с виртуальных портов могут быть легко и быстро переданы другим пользователям.
Вкладка клиентские порты позволяют создавать порты на компьютере, которые подключаются к расширенным портам через виртуальный кабель нуль-модема. Стоит сказать, что виртуальный кабель программа предусматривает автоматически.
Вкладка локальные порты даёт возможность просматривать, создавать и удалять все пары виртуальных COM-портов.

Перейдём во вкладку локальные порты и нажмём кнопку Add. Перед нами откроется окно, предлагающее создать пару COM-портов, которые предполагаются быть соединёнными виртуальным нуль-модемным кабелем:

Создание виртуального com-порта в windows7

Создание виртуального com-порта в windows7

Жмём ОК. Переходим в Панель управления -> Система -> Диспетчер устройств.
Видим, что наши COM-порты были успешно созданы:

Виртуальные com-порты windows

Виртуальные com-порты windows

Взаимодействие расширенных и клиентских COM-портов

Скорее всего, непонятным остаётся вопрос взаимодействия этих двух вкладок. На самом деле всё просто: расширенные порты позволяют делиться своими com-портами, то есть всей информацией, что доступны с устройств, подключённых к этим портам. Они подключаются к клиентским: тем, которые получают всю необходимую информацию.

Для создания расширенного порта достаточно в первой вкладке нажать кнопку Add и выбрать порт, которым мы делимся:

Расшаренный com-порт windows

Расшаренный com-порт windows

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

Клиентский com-порт windows

Клиентский com-порт windows

Итоги

За бортом осталось ещё много чего интересного на тему COM-портов. Хотя эта технология и отходит на второй план с развитием других интерфейсов для подключения устройств, тем не менее пока что она всё ещё активно используются и знать тонкости её работы очень полезно.

Admin

IT-cпециалист с высшим техническим образованием и 8-летним опытом системного администрирования. Подробней об авторе и контакты. Даю бесплатные консультации по информационным технологиям, работе компьютеров и других устройств, программ, сервисов и сайтов в интернете. Если вы не нашли нужную информацию, то задайте свой вопрос!

Читайте так же:
Диск для резки нержавеющей стали

Похожие статьи

Комментариев

Довольно сложным языком написано, без подведения итогов и раскрытия самим же заданных вопросов

А какие вам нужны итоги? Статья лишь показывает способы создания com-порта. Если что-то осталось непонятным — спрашивайте, мы всегда рады ответить на хорошие вопросы.

Посмотрите еще дополнительно на эту тему здесь и здесь, возможно это вам будет интересно.

Подскажите как быть:

У меня есть теплосчетчик, с него считываются данные по RS-232, мне необходимо сигнал с RS-232 передать по сети Ethernet, не использую дополнительного оборудования (таких как Moxa).

Схема получается такая:

Устройство с RS-232 >>>> сеть Ethernet >>>>> Программное обеспечение, которое работает только с COM портами.

Алексей, если я правильно понимаю, то без адаптера com-to-ethernet (rs-232-ethernet) это невозможно сделать. Если вы не хотите использовать такой преобразователь, тогда вам нужно иметь com-port на принимающем компьютере.

Либо, если у вас вся загвоздка в передаче на дальнее расстояние по схеме rs-232>>>comp1>>>ethernet>>>comp2>>>софт, и по каким-то причинам нельзя использовать com-ethernet (1 сетевой интерфейс на принимающем хосте?), возможно вам подойдёт com-to-usb. Принимаете на первичный компьютер сигнал по юсб и дальше отправляете его по сети на обрабатывающий компьютер.

Com порт на принимающем компьютере будет.

Опишу точнее схему:

Прибор Взлет ТСРВ-033 >>> Cisco 2960 >>> 5 км кабельного расстояния между счетчиком и принимающей Cisco >>> Cisco 2960 >>> п.к. с Com портом >>> программное обеспечение, в настройках которого разрешена работа только с Com портом.

Каким программным средством мне достучаться до cisco 2960 на стороне прибора, или непосредственно прибора?
Максимум, что можем себе позволить купить — адаптера com-to-ethernet не имеющий сетевого адреса, работающий просто как конвертор.
Moxa имеет сетевой адрес, и нет никакой проблемы организовать данную схему.
На aliexpress нашли адаптер com-to-ethernet который не дает возможности идентифицировать его адрес в сети. Получается, если мы установим адаптер между ТСРВ-033 и cisco 2960, то последним сетевым элементов имеющим адрес, будет порт cisco 2960.
Есть виртуальные com порты (например TCP COM BRIDGE AGG SOFTWARE), но они не отрабатывают так, как заявлено. Не проходит ping до заявленного мной адреса.

Да уж, задачка нетривиальная… Если я правильно понимаю, тут нужно что-то выдумывать на самой Cisco. А это ещё и всего лишь свитч и адрес на нём предназначен только для управления?) Вообще, посмотрите вот здесь https://en.wikipedia.org/wiki/COM_port_redirector. Там обширный список софта, возможно что-то из этого можно выбрать и попробовать. Поздно увидел ваше сообщение, у меня уже 5 утра… Сейчас лезет только бредовая мысль компилить что-нибудь из этого софта под IOS на свитче, там принимать со счётчика и пересылать дальше… Но скорей всего что-нибудь из этого софта должно увидеть удалённый ком-порт счётчика прямо с компьютера. И насчёт софтины не понял тоже, зачем вам там пинги до каких-то адресов? Если у вас вся схема уровнем ниже tcp/ip, на канальном. Я не знаю как данные с ком-порта будут коммутироваться свитчами без третьего уровня. Я завтра ещё узнаю у сетевиков.

Про ping это я так..чтобы понятно было. А получается, что запутал. Данные программы создают виртуальный Com порт, в котором прописывается ip адрес удаленного сетевого элемента. Так вот итог работы всех этих программ — сеть закрыта (узел не доступен)

Я понял, понял Вас… Артур (кстати, почему каждый раз разное имя?). Значит так. Конечно у вас не получится обратиться по IP-адресу свитча, потому как он предназначен только для управления. Ваша схема работает на канальном уровне модели OSI, она ничего «не знает» о TCP/IP. Соответственно, чтобы вам сделать это нужно писать какой-то софт, запускать его на удалённом свитче(!), чтобы он снимал данные со счётчика и отправлял их на комп… В общем, это извращение… Это был вариант первый. Но если есть много времени и головастый гик «под рукой»… вполне себе.

Вариант два. Дешевле и быстрее поставить старенький компьютер с ком-портом, пылящийся у кого нибудь в гараже. Это предложили сетевики, между прочим:)

С Moxa всё понятно, действительно дороговато. Но почему не рассмотрите российские конвертеры rs-232-to-eth? Я поискал по ценам, оно стоит раз в 10-20 дешевле Moxa, например тут. Возможно старый компьютер можно найти ещё дешевле, но на производстве такой конвертер — это третий, оптимальный вариант, как мне кажется. Меньше железа и проводов — меньше точек отказа. К тому же, оно поставляется со всем необходимым софтом.

Поставить системный блок и использовать его как удаленный рабочий стол нельзя, почему — не знаю, просто политика организации), возможно потому, что это подвальное помещение, не предназначенное для эксплуатации в нем вычислительной техники, а значит не проходящее нормы охраны труда и промышленной безопасности, вдруг пожар, а обслуживающего персонала там не бывает. Это самый простой способ, над которым думать не нужно. Было рац.предложение с Moxa, которое всех устраивало, но Moxa сгорела, другой такой нет. Российские конвертеры — нет. Нет денег вообще, нужен бесплатный вариант. Moxa нашлась на складах, поэтому была она, а покупать что то новое нельзя. Не то чтобы нельзя, просто это должно выглядеть как гениальная работа мозга, показать, что мы способны из ничего сделать всё, доказать, что не просто так сидим. Так то у нас есть ещё вариант, пустить всё это через мультиплексорное (alcatel 1515, 1511) оборудование. Но думаем мы во всех направлениях. Вдруг где стрельнет. Спасибо Вам, консультации полезны. Список программ с Wikipedia просмотрен за долго до написания Вам).

Читайте так же:
Как высчитать плотность материала

Понятно. Я так и подозревал, что здесь уже дело принципа, а не денег, ибо для реальной производственной задачи это все выглядит несколько… неадекватно 🙂 Сразу подумал, что это студенты или лаборанты в каком нибудь НИИ 🙂

Ну если так, то я бы развивал именно первый вариант, пришедший в голову 🙂 Взять какой то опенсорсный софт из того самого списка с вики и переписать его, скомпилить под операционку циски. Это будет как раз самое что ни на есть «из воздуха», технарей вы этим удивите, однозначно. А вот руководителей-не-технарей — вряд ли 🙂

Если есть принтер с разъемом под COM-порт, а на компе этого разъема нет, то как его подключать? Поставила я драйвер для виртуального COM-порта, но он же физически на компьютере не появился.

Переходник com-to-usb поможет для подключения такого принтера.

Доброго дня. Тоже своеобразный вопрос. Есть теплосчетчик СТГ941.20 с выходом rs232 -> преобразователь rs232 — rs485 -> трасса 50 метров (ftp 5e) -> преобразователь rs485 — usb -> компьютер с ПО производителя счетчика. При установке преобразователя rs485 — usb создается usb порт, а ПО работает только с com-портом. Можно ли как-то виртуальный сom порт привязать к реальному usb. В программе выше как создать нашел, а вот можно ли привязать не понял.

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

Привет!
— есть смартфон и в нем симка с 1000 бесплатных СМС/мес
— есть ВИН7 с установленными прогами (1.виртуальный СОМ-порт и 2.отправка СМС через СОМ порт)
— надо их соединить, чтобы прога смогла отправлять СМС через мой смартфон.
Есть ли решение?

Здравствуйте. У меня такой вопрос. Есть 1 ком порт. Этот порт все время слушает некая программа. Нужно сделать так что бы этот порт делился на два виртуальных, что бы информацию с порта в реальном времени могла получать еще одна программа.

К сожалению, я никогда не использовал эти программы, поэтому не представляю как это можно сделать.
Однако простой запрос в поиск находит, что такие решения существуют и называется оно Serial Port Splitter.

HAL. USB. Virtual Com Port

Отладочную плату ипользуем ту же: STM32F4-DISCOVERY.

Проект создаём из проекта I2CLCD80. Назовем его USB_OTG_CDC. Запустим проект в Cube, включим USB_OTG_FS в режим Device_Only

image00

В USB_DEVICE в разделе Class For FS IP выберем пункт Communication Device Class (Virtual Port Com).

image02

Лапки портов PD4-PD7, PB8, PB9 отключим, это пережиток прошлых занятий

image01

В Clock Configuration выберем следующие делители (нажмите на картинку для увеличения изображения)

image04_0500

В Configuration ничего не трогаем, т.к. прерывания там выставились сами.

Сгенерируем и запустим проект, подключим lcd.c и настроим программатор на автоперезагрузку.

Соберем проект. Прошьём контроллер. У нас появится неизвестное устройство, скачаем драйвер на наше виртуальное устройство usb. Для этого зайдем на сайт st.com, в строке поиска там вводим virtual com port, скачиваем и устанавливаем драйвер. Затем желательно зайти в папку с установленным драйвером, выбрать папку, соответствующую разрядности нашей операционной системы, и запускаем также установку и оттуда.

У нас скорей всего устройство установится с ошибкой (код 10)

image03

Есть несколько типов решений, мне понравился именно этот, т.к. более простой: в файле usbd_cdc.h заменим размер пакета, вместо 512 напишем 256 в данной строке:

#define CDC_DATA_HS_MAX_PACKET_SIZE 256 /* Endpoint IN & OUT Packet size */

Соберём, прошьём и увидим, что ошибка исчезла.

Начнём писать код.

Сначала попытаемся передать данные на ПК.

Для этого мы сначала откроем файл usbd_cdc_if.c и исправим там в 2х строчках 4 на 64

/* It's up to user to redefine and/or remove those define */

#define APP_RX_DATA_SIZE 64

#define APP_TX_DATA_SIZE 64

В файле main.c закомментируем весь пользовательский код кроме инициализации и очистки дисплея

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

Также в main.c подключим файл usbd_cdc_if.h для видимости функций приема и передачи

/* USER CODE BEGIN Includes */

Немного изменим в главной функции строковую переменную, убавив в ней размер и добавив префикс tx

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

В файле usbd_cdc_if.c добавим прототип функции передачи, скопировав объявление из реализации данной функции в том же файле

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

В main() внесём данные в строку

/* USER CODE END 2 */

В бесконечном цикле попробуем эти данные отправить в порт USB, используя функцию, прототип которой мы добавили

CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

/* USER CODE END WHILE */

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе.

Вроде передать нам что-то удалось. Теперь попробуем что-нибудь принять. Здесь чуть посложнее, т.к. для этого используется уже обработчик прерывания, коим является в файле usbd_cdc_if.c функция CDC_Receive_FS.

Добавим ещё одну строковую глобальную переменную в main()

/* USER CODE BEGIN PV */

/* USER CODE END PV */

Объявим её также и в файле usbd_cdc_if.c

/* USER CODE BEGIN PRIVATE_VARIABLES */

extern char str_rx[21];

/* USER CODE END PRIVATE_VARIABLES */

Читайте так же:
К каким дефектам относятся трещины поры

В функцию CDC_Receive_FS в этом же файле добавим некоторый код и кое-что закомментируем

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)

/* USER CODE BEGIN 6 */

Добавим переменную в main()

/* USER CODE BEGIN 1 */

Занесенные в наш буфер данные попробуем вывести на дисплей, для этого в бесконечном цикле в функции main() добавим определённый код

CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

Соберём проект. Прошьём код и посмотрим результат, вводя в терминальной программе и отправляя в порт USB какие-нибудь строки.

STM32 HAL. USB. Virtual Com Port

22 комментария на “ STM Урок 33. HAL. USB. Virtual Com Port ”

"Есть несколько типов решений, мне понравился именно этот, т.к. более простой: в файле usbd_cdc.h заменим размер пакета, вместо 512 напишем 256 в данной строке…."

Просто измените размер кучи (Minimum Heap Size) в настройка CubeMX. Вместо значения 0x200 задайте 0x400.

И комп увидит устройство без ошибок.

При инициализации структур компилятору элементарно не хватает места, заданного по умолчанию, для выделения памяти.

Пардон, очепятка вышла. Не компилятору, а функции malloc.

Спасибо, так действительно проще.

Спасибо огромное за ваши материалы по STM32 , подключил TFT 320×240 – все отлично работает . Вернулся к материалу для подключения флешки . Все отладочные средства у меня находятся на VirtualBox ( W7 ) . Скачал по вашей инструкции и поставил драйвер Virtual com port . Он поставился , но в диспетчере задач ничего не появилось ни в разделе com портов , ни в других . Может вы сталкивались с подобной проблемой ? Если нет – в любом случае еще раз спасибо за проделанную работу .

Сначала не смог реализовать данный пример на SystemWorkbench в части приёма данных и передачи их из функции приёма в main посредством массива str_rx с модификатором extern – компилятор ругается на использование неопределённых переменных, а если задать ему какие-нибудь значения, то только эти заданные значения и будут передаваться. Вышел из положения объявив массив обмена str_rx в заголовочном файле usbd_cdc_if.h

Спасибо.Я сделал так.В хидер usbd_cdc_if.h добавил две строчки
extern uint8_t UserRxBufferFS[1000];
uint8_t receiveBufLen;
В метод CDC_Receive_FS добавил перед return receiveBufLen = *Len;
И в main ловил данные просто одним условием
if(receiveBufLen > 0)// если получены данные от ПК
<
HAL_Delay(250);
CDC_Transmit_FS((uint8_t*) UserRxBufferFS,receiveBufLen);
// эхо для наглядности
receiveBufLen = 0;// сброс получения
>
Всё просто,а UserRxBufferFS чистить не нужно от мусора,он сам чистится.

может в usbd_cdc_if.c ?

Здравствуйте! Спасибо огромное за ваши уроки, тут пожалуй лучший ресурс с уроками по стм32!
Хочу спросить, а как использовать CDC_Receive_FS в main.c? Я проделал в usbd_cdc_if.c "эхо", но мне нужно принимать из него и гнать дальше. Наверное вопрос больше в целом по си чем по контроллеру, а то иначе мне получается надо много всего переносить в usbd_cdc_if.c.

Думаю, что следует добавить в main.c функцию, а в файле usbd_cdc_if.c – на неё прототип и вызвать её в CDC_Receive_FS, И весь свой пользовательский код затем писать в файле main.c.
Это именно СИ. Так что обязательно подтяните свои знания по языку.

Ох, видимо сперва надо читать коментарии, прочитал тот что выше.

При переходе на USB cтолкнулся с такой проблемой. Скажем, конструкция, приведённая в примере, а именно
sprintf(str_tx,"USB Transmitrn");
CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));
работает без проблем. Но, если я делаю так
sprintf(str_tx,"USB Transmit");
CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));
CDC_Transmit_FS((unsigned char*)"rn", 2);
то CDC_Transmit_FS((unsigned char*)"rn", 2); не срабатывает (не успевает) и данные летят без переноса строки. Если ставить задержку, то работает как надо. По неопытности, может, это я и принял бы как должное, если бы перед этим не работал бы с UART где такая же конструкция работает без проблем. Для работы с UART уже написана довольно хорошая часть программы и менять её структуру очень не хочется, тем более, что данные передаются не в текстовом формате а в посылке имеется несколько меток. Что можно сделать, чтобы посылки могли идти подряд без задержки?

Скорей всего придется делать конкатенацию передаваемых строк с помощью strcat. Была аналогичная проблема при использовании CDC. Автор применял этот метод в одном из уроков.

Здравствуйте
А если я хочу передавать данные с микроконтроллера на компьютер?

Константин:
А мы их туда и передали.

Установил различные драйвера VCP от STM, но при этом плата не определяется при подключении её к компьютеру. только виден STLink Virtual COM Port. Кто уже сталкивался с такой проблемой.

Оказалась, что проблема с дровами. Надо их полностью сносить и устанавливать заново.

Hello, I'm new to STM32. How do I send int32_t value via usb CDC from ADC input ? or How to convert int32_t to char?

You can use(for example):

sprintf(str_tx,"ADC:%d rn",ADC_Data);
CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

where ADC_Data is your ADC value.

Спасибо за примеры. С USB в базовой библиотеке что-то не так. При первом подключении ком порт работает, но при передергивании USB – становится неизвестным устройством, иногда не сразу а через 5-10 секунд после повторного подключения…
Сейчас копаю в сторону функций вызываемых на отключение и подключение USB. Первое что кажется подозрительным, то что на подключение вызывается инициализация а на отключение USBD_LL_Suspend, затем на подключение снова инициализация, хотя есть USBD_LL_Resume. Пока дальнейших идей нет. Может что-то подскажете?

могу скачать драйвера для виртуального ком порта. У меня STM32F415RG, может есть у кого?

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector