STML4 USB 虚拟串口
STML4 USB virtual com port
我有 nucleo 板 (nucleo-L4R5ZI),想编写一个代码,以便能够通过 USB 将数据从 uC 发送到 PC。我遵循了一些教程,使用了 STM32CubeMx,以及在 Internet 上找到的其他解决方案,但无论如何我都失败了。我可以在PC端打开vcp(使用Hterm、TeraTerm和Realterm),但是无法获取任何数据。
我使用 Eclipse 和内置调试器,我将其闪存到 JLink。
主循环:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
HAL_Delay(10000);
uint8_t HiMsg[] = "0123456789987654321001234567899876543210\r\n";
while (1)
{
if( CDC_Transmit_FS(HiMsg, 20) == USBD_OK )
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7); // blue LED
}
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14); // red LED
HAL_Delay(1000);
}
}
执行此函数后,蓝色 LED 灯只亮一次并且永远不会改变其状态(不闪烁)。这意味着 CDC_Transmit_FS(...) returns USBD_OK 只有一次,下一次调用会给出 USBD_Busy。
MX_USB_DEVICE_Init() 如下所示:
void MX_USB_DEVICE_Init(void)
{
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
USBD_CDC_Init (&hUsbDeviceFS, &USBD_CDC); // I need to init it somewhere so I think here is a good place
}
CDC_Transmit_FS 看起来像这样:
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
/* USER CODE BEGIN 7 */
CDC_Init_FS();
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
if (hcdc->TxState != 0){
return USBD_BUSY;
}
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
CDC_Init_FS();
/* USER CODE END 7 */
return result;
}
有人知道怎么做吗运行?我想念什么?
最佳,
这部分看起来很可疑:
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
CDC_Init_FS();
调用 CDC_Init_FS()
可能会在数据包有机会发送到主机之前将其终止。
所以...我找到了解决方案!
我可以确认上面的代码有效(只需删除 CDC_Init_FS)!
准确来说是驱动问题。对于 windows 10,您还需要安装它,尽管参考文献中写的是什么
我有 nucleo 板 (nucleo-L4R5ZI),想编写一个代码,以便能够通过 USB 将数据从 uC 发送到 PC。我遵循了一些教程,使用了 STM32CubeMx,以及在 Internet 上找到的其他解决方案,但无论如何我都失败了。我可以在PC端打开vcp(使用Hterm、TeraTerm和Realterm),但是无法获取任何数据。
我使用 Eclipse 和内置调试器,我将其闪存到 JLink。
主循环:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
HAL_Delay(10000);
uint8_t HiMsg[] = "0123456789987654321001234567899876543210\r\n";
while (1)
{
if( CDC_Transmit_FS(HiMsg, 20) == USBD_OK )
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7); // blue LED
}
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14); // red LED
HAL_Delay(1000);
}
}
执行此函数后,蓝色 LED 灯只亮一次并且永远不会改变其状态(不闪烁)。这意味着 CDC_Transmit_FS(...) returns USBD_OK 只有一次,下一次调用会给出 USBD_Busy。
MX_USB_DEVICE_Init() 如下所示:
void MX_USB_DEVICE_Init(void)
{
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
USBD_CDC_Init (&hUsbDeviceFS, &USBD_CDC); // I need to init it somewhere so I think here is a good place
}
CDC_Transmit_FS 看起来像这样:
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
/* USER CODE BEGIN 7 */
CDC_Init_FS();
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
if (hcdc->TxState != 0){
return USBD_BUSY;
}
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
CDC_Init_FS();
/* USER CODE END 7 */
return result;
}
有人知道怎么做吗运行?我想念什么?
最佳,
这部分看起来很可疑:
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
CDC_Init_FS();
调用 CDC_Init_FS()
可能会在数据包有机会发送到主机之前将其终止。
所以...我找到了解决方案! 我可以确认上面的代码有效(只需删除 CDC_Init_FS)!
准确来说是驱动问题。对于 windows 10,您还需要安装它,尽管参考文献中写的是什么