Не работает virtual com port stm32

В чем проблема с виртуальным COM-портом STM32? Я не могу это открыть

У меня есть плата Nucleo STM32H743ZI. Я использую CubeMX HAL (я пробовал несколько версий) и TrueStudio. «Виртуальный COM-порт» появляется в Windows 10 (я пробовал драйвер Windows по умолчанию и драйвер ST), но не могу открыть порт. Моя C # программа пишет мне «Параметр неверен», когда я пытаюсь открыть его:

То же сообщение пишет мне программа Realterm, PuTTY ничего не делает и программа «Tera Term» работает правильно — я могу отправлять и получать данные в мою программу MCU.

Может кто-нибудь знает что это?

В моей программе на C # и в терминальных программах я использую одни и те же параметры

Информация о USB-устройстве просмотра:

2 ответа

У меня была такая же проблема, я мог прочитать устройство и увидеть, какой com-порт, но я не мог открыть его. (для CDC)

Там упоминается, что вам нужно добавить несколько линий, если вы хотите связываться с RS232 через VCP.

Я добавил следующее в файл usbd_cdc_if.c:

И настроил функцию CDC_Control_FS:

Я надеюсь, что это все еще полезно для вас.

Прошивка FW1.4.0 для STM32H7 работает некорректно. Я должен использовать FW1.3.2 и CubeMX 5.2.1.

Но если я инициализирую шину FMC, виртуальный COM-порт снова работает некорректно, если я комментирую инициализацию, он снова работает правильно

Интересно, что функции C: «fopen (« COM6 »,« r + »), fwrite, fgetc, fclose» — работают в Windows 10 с FW1.4.0 без настройки порта. Ошибка FW1.4.0 в записи параметров порта (в бодах, битах или других) и драйвер Windows виртуального COM-порта возникает исключение, если не может записать параметры в USB-устройство

Источник

У STM32H743ZI не работает корректно CDC Virtual COM port через USB FullSpeed

Борюсь с виртуальным COM портом через USB FS, есть две платы моя собственная и Nucleo. На форуме ST создать тему мне не позволяют, а на сообщение в старой теме ни кто не ответил.

Использую CubeMX 5.2.1 и Firmware FW 1.4.0. Windows 10 определяет COM port, но вот общаться через него нормальным способом не удается. В терминальных программах PuTTY, Real term выдается сообщение, что не верные параметры порта, такое же исключение выбрасывает C# и Qt при попытке открыть порт («The parameter is incorrect»). Параметры пробовал разные и самые простые из настроек драйвера по умолчанию 8 бит, 9600, без четности, 1 стоп, без flowcontrol (в Linux все работает при любых параметрах, что в Qt, что в терминальных программах). Пробовал использовать драйвер Windows по умолчанию и устанавливать с сайта ST для Windows 7 — поведение одинаковое.

В Windows 10 удается однако тоже общаться через COM порт с помощью программы TeraTerm или пользуясь Си функциями: fopen(«COM6», «r+»), fwrite, fread, fclose — т.е. без всяких параметров работы порта. Но хотелось бы, чтобы порт мог работать нормально со всеми программами.

Такое впечатление, что драйверу COM порта не удается записать параметры в USB устройство и он поэтому не хочет с ним работать, Linux видимо такие проверки записываемых параметров не делает.

Пробовал использовать более старые версии CubeMX 4.27.0 и FW 1.3.2 там дела еще хуже — компьютер не видит USB устройство. Точнее, если загрузить и запустить быстро прошивку после более новой, новый COM порт с другим номером появляется и даже работает через PuTTY, но стоит включить/выключить питание COM порт не появляется, так же если просто начисто загрузить прошивку, т.е. FW 1.3.2 не устанавливает соединение (VBUS sense включено, но не работает)

Добавлено через 21 минуту
Размер кучи увеличиваю до 0x400

В файле usbd_desc.c исправляю ошибку

===>Device Descriptor This is a Communication Device
bDeviceSubClass: 0x02
*!*ERROR: bDeviceSubClass of 2 is invalid
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x40 = (64) Bytes
idVendor: 0x0483 = STMicroelectronics
idProduct: 0x5740
bcdDevice: 0x0200
iManufacturer: 0x01
English (United States) «STMicroelectronics»
iProduct: 0x02
English (United States) «STM32 Virtual ComPort»
iSerialNumber: 0x03
English (United States) «383A34463137»
bNumConfigurations: 0x01

Читайте также:  Автокад вычитание не работает

на bDeviceSubClass 0x00

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

Источник

STM32 — Virtual COM Port

Коротенькая заметка про инициализацию USB у микроконтроллеров stm32.

Чтобы использовать VCP (Virtual COM port) без переподключения USB-кабеля, нужно при инициализации МК кратковременно прижать D+ к «земле». Суть заключается в том, что компьютер узнаёт о подключении нового usb-устройства когда видит высокий потенциал на линии D+. У usb-устройства эта линия подключена к «плюсу» через резистор 1.5КОм. Подключение может быть как напрямую, так и через управляющий транзистор (см. схемы ниже).

Как только комп увидел usb-устройство, то они «договариваются» между собой, а после начинается обмен данными.

Когда плата перезагружается (нажатие кнопки Reset или загрузка новой прошивки), то получается примерно следующее: для компьютера ничего не изменилось, он по прежнему думает что устройство подключено (ведь «плюс» то на линии D+ никуда не исчезал). Однако изначальная «договорённость» между ними пропадает, в результате чего возникает ошибка и обмен данными невозможен. Чтобы восстановить связь, нужно переподключить usb-устройство. Для того чтобы не перетыкать провод нужно просто кратковременно прижать линию D+ к «земле» (компьютер расценит это как отключение устройства), а потом подать на неё «плюс» (компьютер поймёт что подключилось новое устройство).

Если у платы нет управляющего транзистора, например как у BluePill или у Discovery STM32F303…

… тогда в программе это можно реализовать так: перед инициализацией USB инициализировать пин D+ как выход, записать в него «0», сделать паузу, и переинициализировать его для работы с USB.

Добавляем код в функцию инициализации GPIO…

Не забывайте про то, что если снова сгенерируете проект в Кубе, то всё затрётся.

Если есть управляющий транзистор, например как у платы XNUCLEO-103-302-401…

… то лучше воспользоваться им. В данном случае подтяжка линии D+ управляется пином PD2 через PNP транзистор.

PNP транзистор открывается «минусом», NPN — «плюсом».

На некоторых фирменных платах, D+ подключён через резистор к пину МК, например как у Nucleo-144…

В данном случае надо кратковременно подавать «минус» на пин PG6…

У меня такой платы нет, поэтому не проверял.

И да, перед нажатием Reset на МК нужно закрывать терминал на компе. Если не закрывать, то естественно, что после ресета порт поменяется.

Это всё, всем спасибо

Источник

Windows 7 не может найти ранее установленный драйвер виртуального COM-порта STM32

У меня есть плата STM32F4 Discovery с прошивкой, которая реализует устройство USB CDC. После подключения я должен увидеть устройство виртуального COM-порта в диспетчере устройств Windows.

Я установил драйвер виртуального COM-порта STM32 , запустив VCP_V1.4.0_Setup.exe. Моя система 32-битная, Windows 7.

Проблема в том, что когда я подключаю плату обнаружения, Windows говорит:

Имя устройства отображается правильно («Виртуальный COM-порт STM32»), но Windows не может найти драйвер ни в сети, ни локально.

Я установил драйвер, поэтому не понимаю, что происходит.

1 ответ 1

Оказалось, что установка драйвера не была завершена. После запуска VCP_V1.4.0_Setup.exe должен быть выполнен другой exe- файл для завершения установки драйвера.

1- Удалить предыдущие версии (Пуск-> Настройка-> Панель управления-> Установка и удаление программ)

2- Запустите ваш «VCP_V1.4.0_Setup.exe»

3- Перейдите в каталог установки — пример, C:\Program Files (x86)\STMicroelectronics\Software\Virtual comport driver

4- Перейдите в каталог версий вашей ОС ([Win7] или [Win8])
+ Тогда:
— Дважды щелкните файл dpinst_x86.exe, если вы используете 32-разрядную версию ОС.
— Дважды щелкните файл dpinst_amd64.exe, если вы работаете в 64-битной версии ОС.
+ Следуйте инструкциям.

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

Источник

STM Урок 33. HAL. USB. Virtual Com Port

Урок 33

HAL. USB. Virtual Com Port

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

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

Читайте также:  Не работает фронтальная камера ксиаоми

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

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

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

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

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

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

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

Есть несколько типов решений, мне понравился именно этот, т.к. более простой: в файле 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 какие-нибудь строки.

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 Transmit\r\n»);
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*)»\r\n», 2);
то CDC_Transmit_FS((unsigned char*)»\r\n», 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 \r\n»,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, может есть у кого?

Источник

Оцените статью