STM32 USB VCP(虚拟串口)
STM32 USB VCP (Virtual Com Port)
我使用 CubeMX for USB VCP 为 "stm32f103c8t6" 生成了代码,当我添加 "CDC_Transmit_FS" 命令发送数据时,windows10 无法识别端口!
我应该怎么办?这是编译没有错误的代码:
#include "stm32f1xx_hal.h"
#include "usb_device.h"
#include "usbd_cdc_if.h"
int main(void)
{
uint8_t Text[] = "Hello\r\n";
while (1)
{
CDC_Transmit_FS(Text,6); /*when commented the port is recognized*/
HAL_Delay(1000);
}
}
在 CDC_Transmit_FS
调用之前延迟 - 它将等待初始化。你的代码应该是这样的
int main(void)
{
uint8_t Text[] = "Hello\r\n";
HAL_Delay(1000);
while (1)
{
CDC_Transmit_FS(Text,6); /*when commented the port is recognized*/
HAL_Delay(1000);
}
}
您可能需要安装驱动程序才能将设备识别为 com 端口
你可以从 st 网站得到它
如果未安装,设备会在设备管理器中列出带有问号或感叹号的设备
请注意,在设备连接到主机之前,您无法发送!
不确定 CubeMX CDC_Transmit_FS 正在检查这个
也不要延迟重新发送,您应该检查 CDC class 数据 "TXSstate"
为 0 表示 tx 结束。
根据我的经验,您需要检查三件事:
- startup_stm32f405xx.s --> 增加堆大小。我也使用堆大小 800 和堆栈大小 800。
- usbd_cdc_if.c --> APP_RX_DATA_SIZE 64 和 APP_TX_DATA_SIZE 64
- usbd_cdc_if.c --> 将以下代码添加到 CDC_Control_FS() 函数
代码:
case CDC_SET_LINE_CODING:
tempbuf[0]=pbuf[0];
tempbuf[1]=pbuf[1];
tempbuf[2]=pbuf[2];
tempbuf[3]=pbuf[3];
tempbuf[4]=pbuf[4];
tempbuf[5]=pbuf[5];
tempbuf[6]=pbuf[6];
break;
case CDC_GET_LINE_CODING:
pbuf[0]=tempbuf[0];
pbuf[1]=tempbuf[1];
pbuf[2]=tempbuf[2];
pbuf[3]=tempbuf[3];
pbuf[4]=tempbuf[4];
pbuf[5]=tempbuf[5];
pbuf[6]=tempbuf[6];
break;
并在用户 private_variables 部分定义 uint8_t tempbuf[7];
。
没有增加堆大小,Windows 根本没有反应。
如果没有第 3 点,Windows 将发送波特率信息,然后读取波特率,期望返回相同的值。由于您没有 return 任何值,因此虚拟 com 端口保持为未加载驱动程序。
如果您完成所有这些操作,则可以使用 Windows 10 开箱即用的 VCP 驱动程序。无需在您的系统上安装非常旧的 ST VCP 驱动程序。
PS:我在某处读到打开 VSense 也会出现问题。不知道,我还没有配置它,一切都很顺利。
我知道有点晚了,但我偶然发现了这个 post,它非常有用。
这是我需要做的事情:
- 进行线路编码(我认为只在 Windows-系统上有必要)
- 增加堆(堆栈保留为默认 0x200)
这里是对我来说不需要的(在 STM32F405RGT6 芯片上):
- 更改 APP_RX_DATA_SIZE / APP_TX_DATA_SIZE(保留在 2048)
- 在 运行 CDC_Tranmit_FS()
之前添加延迟
还有一些我过去发生的事情要考虑:
- 务必使用带数据线的 USB 数据线(大多数充电线都没有)
- 如果您使用自定义板
,请仔细检查 traces/connections
我有类似的问题。我无法连接到端口,该端口显示为“虚拟 com 端口”。我添加了 while 循环以等待来自 CDC_Transmit_FS 的 USBD_OK。然后它甚至在没有它的情况下也能正常工作,或者在 init 函数之后有延迟。我不确定是什么问题。
while(CDC_Transmit_FS((uint8_t*)txBuf, strlen(txBuf))!=USBD_OK)
{
}
我使用 CubeMX for USB VCP 为 "stm32f103c8t6" 生成了代码,当我添加 "CDC_Transmit_FS" 命令发送数据时,windows10 无法识别端口! 我应该怎么办?这是编译没有错误的代码:
#include "stm32f1xx_hal.h"
#include "usb_device.h"
#include "usbd_cdc_if.h"
int main(void)
{
uint8_t Text[] = "Hello\r\n";
while (1)
{
CDC_Transmit_FS(Text,6); /*when commented the port is recognized*/
HAL_Delay(1000);
}
}
在 CDC_Transmit_FS
调用之前延迟 - 它将等待初始化。你的代码应该是这样的
int main(void)
{
uint8_t Text[] = "Hello\r\n";
HAL_Delay(1000);
while (1)
{
CDC_Transmit_FS(Text,6); /*when commented the port is recognized*/
HAL_Delay(1000);
}
}
您可能需要安装驱动程序才能将设备识别为 com 端口 你可以从 st 网站得到它 如果未安装,设备会在设备管理器中列出带有问号或感叹号的设备
请注意,在设备连接到主机之前,您无法发送! 不确定 CubeMX CDC_Transmit_FS 正在检查这个 也不要延迟重新发送,您应该检查 CDC class 数据 "TXSstate" 为 0 表示 tx 结束。
根据我的经验,您需要检查三件事:
- startup_stm32f405xx.s --> 增加堆大小。我也使用堆大小 800 和堆栈大小 800。
- usbd_cdc_if.c --> APP_RX_DATA_SIZE 64 和 APP_TX_DATA_SIZE 64
- usbd_cdc_if.c --> 将以下代码添加到 CDC_Control_FS() 函数
代码:
case CDC_SET_LINE_CODING:
tempbuf[0]=pbuf[0];
tempbuf[1]=pbuf[1];
tempbuf[2]=pbuf[2];
tempbuf[3]=pbuf[3];
tempbuf[4]=pbuf[4];
tempbuf[5]=pbuf[5];
tempbuf[6]=pbuf[6];
break;
case CDC_GET_LINE_CODING:
pbuf[0]=tempbuf[0];
pbuf[1]=tempbuf[1];
pbuf[2]=tempbuf[2];
pbuf[3]=tempbuf[3];
pbuf[4]=tempbuf[4];
pbuf[5]=tempbuf[5];
pbuf[6]=tempbuf[6];
break;
并在用户 private_variables 部分定义 uint8_t tempbuf[7];
。
没有增加堆大小,Windows 根本没有反应。 如果没有第 3 点,Windows 将发送波特率信息,然后读取波特率,期望返回相同的值。由于您没有 return 任何值,因此虚拟 com 端口保持为未加载驱动程序。
如果您完成所有这些操作,则可以使用 Windows 10 开箱即用的 VCP 驱动程序。无需在您的系统上安装非常旧的 ST VCP 驱动程序。
PS:我在某处读到打开 VSense 也会出现问题。不知道,我还没有配置它,一切都很顺利。
我知道有点晚了,但我偶然发现了这个 post,它非常有用。
这是我需要做的事情:
- 进行线路编码(我认为只在 Windows-系统上有必要)
- 增加堆(堆栈保留为默认 0x200)
这里是对我来说不需要的(在 STM32F405RGT6 芯片上):
- 更改 APP_RX_DATA_SIZE / APP_TX_DATA_SIZE(保留在 2048)
- 在 运行 CDC_Tranmit_FS() 之前添加延迟
还有一些我过去发生的事情要考虑:
- 务必使用带数据线的 USB 数据线(大多数充电线都没有)
- 如果您使用自定义板 ,请仔细检查 traces/connections
我有类似的问题。我无法连接到端口,该端口显示为“虚拟 com 端口”。我添加了 while 循环以等待来自 CDC_Transmit_FS 的 USBD_OK。然后它甚至在没有它的情况下也能正常工作,或者在 init 函数之后有延迟。我不确定是什么问题。
while(CDC_Transmit_FS((uint8_t*)txBuf, strlen(txBuf))!=USBD_OK)
{
}