c - STM32F4 的 USB CDC 设置和库问题

标签 c usb cdc stm32f4

我正在开发 STM32F401RBT6 的嵌入式应用程序,并尝试与 PC (Windows 10) 建立连接,但系统无法识别该设备。我由 STMCubeMX 生成并由 Atollic 调试的代码不起作用。我看到并尝试重现几个例子,但一切都有效。在代码中,我拥有我认为必要的所有库。

archives archives2

我有由 STMCubeMX 生成的用于 CDC 通信的存档,但我是新手,我不知道必须对代码进行哪些修改以便系统能够识别USB。有人可以帮助我吗?

最佳答案

除了 Soup 的要点(默认情况下只有 0x200 的堆导致 malloc 失败)之外,某些 Windows 版本在示例中的行编码存在问题。

在 usbd_cdc_if.c 中您应该添加:

/* USER CODE BEGIN PRIVATE_VARIABLES */
USBD_CDC_LineCodingTypeDef LineCoding =
    {
    115200, /* baud rate*/
    0x00,   /* stop bits-1*/
    0x00,   /* parity - none*/
    0x08    /* nb. of bits 8*/
    };

下面一点

static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
.
.
.
case CDC_SET_LINE_CODING:
    LineCoding.bitrate    = (uint32_t)(pbuf[0] | (pbuf[1] << 8) |\
                            (pbuf[2] << 16) | (pbuf[3] << 24));
    LineCoding.format     = pbuf[4];
    LineCoding.paritytype = pbuf[5];
    LineCoding.datatype   = pbuf[6];

break;

case CDC_GET_LINE_CODING:
    pbuf[0] = (uint8_t)(LineCoding.bitrate);
    pbuf[1] = (uint8_t)(LineCoding.bitrate >> 8);
    pbuf[2] = (uint8_t)(LineCoding.bitrate >> 16);
    pbuf[3] = (uint8_t)(LineCoding.bitrate >> 24);
    pbuf[4] = LineCoding.format;
    pbuf[5] = LineCoding.paritytype;
    pbuf[6] = LineCoding.datatype;
break;

因此,如果主机尝试设置线路编码,他将不会获得未定义的数据。

关于c - STM32F4 的 USB CDC 设置和库问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58341350/

相关文章:

c - 寻找高效的聚类算法

c - 如何仅使用指针在 C 中重新调用字符串数组

usb - Arm7 USB编程

c++ - 虚拟文件系统列表

c - 无指针双向圆阵算法

linux - 如何在 Windows 环境中克隆 LINUX 可启动 USB 笔驱动器

visual-studio-2010 - USBView编译错误

sql-server - 更改数据捕获 - Microsoft 捕获数据更改的最佳实践?

sql-server - 更改数据捕获 - 仅获取不同的最新更改

c++ - 使用 CDC 的 MFC 打印仅适用于某些打印机