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

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

SerialPort port = new SerialPort("COM8", 9600, Parity.None, 8, StopBits.One);
port.Open(); // System.IO.IOException: 'The parameter is incorrect.'

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

Может кто знает что это?

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

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

            [Port1]  :  STMicroelectronics Virtual COM Port


            Is Port User Connectable:         yes
            Is Port Debug Capable:            no
            Companion Port Number:            17
            Companion Hub Symbolic Link Name: USB#ROOT_HUB30#4&2f29167c&0&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}
            Protocols Supported:
             USB 1.1:                         yes
             USB 2.0:                         yes
             USB 3.0:                         no

            Device Power State:               PowerDeviceD0

                   ---===>Device Information<===---
            English product name: "STM32 Virtual ComPort"

            ConnectionStatus:                  
            Current Config Value:              0x01  -> Device Bus Speed: Full (is not SuperSpeed or higher capable)
            Device Address:                    0x0A
            Open Pipes:                           3

                      ===>Device Descriptor<===
            bLength:                           0x12
            bDescriptorType:                   0x01
            bcdUSB:                          0x0200
            bDeviceClass:                      0x02  -> This is a Communication Device
            bDeviceSubClass:                   0x00
            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)  "354BB9433137"
            bNumConfigurations:                0x01

                      ---===>Open Pipes<===---

                      ===>Endpoint Descriptor<===
            bLength:                           0x07
            bDescriptorType:                   0x05
            bEndpointAddress:                  0x82  -> Direction: IN - EndpointID: 2
            bmAttributes:                      0x03  -> Interrupt Transfer Type
            wMaxPacketSize:                  0x0008 = 0x08 bytes
            bInterval:                         0x10

                      ===>Endpoint Descriptor<===
            bLength:                           0x07
            bDescriptorType:                   0x05
            bEndpointAddress:                  0x01  -> Direction: OUT - EndpointID: 1
            bmAttributes:                      0x02  -> Bulk Transfer Type
            wMaxPacketSize:                  0x0040 = 0x40 bytes
            bInterval:                         0x00

                      ===>Endpoint Descriptor<===
            bLength:                           0x07
            bDescriptorType:                   0x05
            bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
            bmAttributes:                      0x02  -> Bulk Transfer Type
            wMaxPacketSize:                  0x0040 = 0x40 bytes
            bInterval:                         0x00

                   ---===>Full Configuration Descriptor<===---

                      ===>Configuration Descriptor<===
            bLength:                           0x09
            bDescriptorType:                   0x02
            wTotalLength:                    0x0043  -> Validated
            bNumInterfaces:                    0x02
            bConfigurationValue:               0x01
            iConfiguration:                    0x00
            bmAttributes:                      0xC0  -> Self Powered
            MaxPower:                          0x32 = 100 mA

                      ===>Interface Descriptor<===
            bLength:                           0x09
            bDescriptorType:                   0x04
            bInterfaceNumber:                  0x00
            bAlternateSetting:                 0x00
            bNumEndpoints:                     0x01
            bInterfaceClass:                   0x02  -> This is Communications (CDC Control) USB Device Interface Class
            bInterfaceSubClass:                0x02
            bInterfaceProtocol:                0x01
            iInterface:                        0x00
              -> This is a Communications (CDC Control) USB Device Interface Class

                      ===>Descriptor Hex Dump<===
            bLength:                           0x05
            bDescriptorType:                   0x24
            05 24 00 10 01 
              -> This is a Communications (CDC Control) USB Device Interface Class

                      ===>Descriptor Hex Dump<===
            bLength:                           0x05
            bDescriptorType:                   0x24
            05 24 01 00 01 
              -> This is a Communications (CDC Control) USB Device Interface Class

                      ===>Descriptor Hex Dump<===
            bLength:                           0x04
            bDescriptorType:                   0x24
            04 24 02 02 
              -> This is a Communications (CDC Control) USB Device Interface Class

                      ===>Descriptor Hex Dump<===
            bLength:                           0x05
            bDescriptorType:                   0x24
            05 24 06 00 01 

                      ===>Endpoint Descriptor<===
            bLength:                           0x07
            bDescriptorType:                   0x05
            bEndpointAddress:                  0x82  -> Direction: IN - EndpointID: 2
            bmAttributes:                      0x03  -> Interrupt Transfer Type
            wMaxPacketSize:                  0x0008 = 0x08 bytes
            bInterval:                         0x10

                      ===>Interface Descriptor<===
            bLength:                           0x09
            bDescriptorType:                   0x04
            bInterfaceNumber:                  0x01
            bAlternateSetting:                 0x00
            bNumEndpoints:                     0x02
            bInterfaceClass:                   0x0A  -> This is a CDC Data USB Device Interface Class
            bInterfaceSubClass:                0x00
            bInterfaceProtocol:                0x00
            iInterface:                        0x00

                      ===>Endpoint Descriptor<===
            bLength:                           0x07
            bDescriptorType:                   0x05
            bEndpointAddress:                  0x01  -> Direction: OUT - EndpointID: 1
            bmAttributes:                      0x02  -> Bulk Transfer Type
            wMaxPacketSize:                  0x0040 = 0x40 bytes
            bInterval:                         0x00

                      ===>Endpoint Descriptor<===
            bLength:                           0x07
            bDescriptorType:                   0x05
            bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
            bmAttributes:                      0x02  -> Bulk Transfer Type
            wMaxPacketSize:                  0x0040 = 0x40 bytes
            bInterval:                         0x00

person Papayaved    schedule 07.06.2019    source источник
comment
Я попробовал программу C++ Qt: в Windows 10 не работает, в Ubuntu работает (но медленно ~ 256 кбит / с. Запрос - протокол подтверждения)   -  person Papayaved    schedule 07.06.2019


Ответы (2)


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

затем я столкнулся со следующим сообщением с последним ответом, имеющим решение моей проблемы: https://community.st.com/s/question/0D50X00009XkgIYSAZ/unable-to-configure-serial-port-error-for-usb-cdc

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

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

/*******************************************************************************/
/* Line Coding Structure                                                       */
/*-----------------------------------------------------------------------------*/
/* Offset | Field       | Size | Value  | Description                          */
/* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/
/* 4      | bCharFormat |   1  | Number | Stop bits                            */
/*                                        0 - 1 Stop bit                       */
/*                                        1 - 1.5 Stop bits                    */
/*                                        2 - 2 Stop bits                      */
/* 5      | bParityType |  1   | Number | Parity                               */
/*                                        0 - None                             */
/*                                        1 - Odd                              */
/*                                        2 - Even                             */
/*                                        3 - Mark                             */
/*                                        4 - Space                            */
/* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */
/*******************************************************************************/
static uint8_t lineCoding[7] // 115200bps, 1stop, no parity, 8bit
    = { 0x00, 0xC2, 0x01, 0x00, 0x00, 0x00, 0x08 };

и скорректированная функция CDC_Control_FS:

static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
  /* USER CODE BEGIN 5 */
  switch(cmd)
  {
   ...
    case CDC_SET_LINE_CODING:
      memcpy(lineCoding, pbuf, sizeof(lineCoding));
    break;

    case CDC_GET_LINE_CODING:
      memcpy(pbuf, lineCoding, sizeof(lineCoding));
    break;
    ...
}

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

person Michaël    schedule 06.08.2019
comment
Добро пожаловать, я думаю, что ST удалил эти строки в новом репозитории. Им лучше добавить его снова, чтобы люди могли программировать быстрее, в основном это то, что люди хотят делать с USB CDC. - person Michaël; 09.08.2019
comment
Спасибо за совет @Michaël. У меня F7 Disco. USB VCP проработал несколько часов, но заблокировал отладчик st-link на USART1. Сейчас у меня наоборот - ST-Link работает на USART1, а USB VCP сломан. Я также закомментировал FMC, DCMI, ETH и LTDC, как показано ниже. Я думаю, что это может быть FreeRTOS, устанавливающая все приоритеты IRQ на 5. - person ChrisR; 11.09.2019
comment
Спасибо. Действительно полезный ответ. Экономит много времени для меня. Работает также на Nucleo-F722ZE - person Anton Bakulev; 04.05.2021

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

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

MX_USB_DEVICE_Init();
//  MX_FMC_Init();

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

person Papayaved    schedule 26.06.2019