Parameter

USB CDC Rx Buffer Size | 数据通信(接收) | 定义从PC接收数据的硬件缓冲区大小 | 抗数据突发能力强,减少丢包风险,增加RAM占用 | 节省RAM,但易因处理不及时导致缓冲区溢出、数据丢失 |
USB CDC Tx Buffer | 数据通信(发送) | 定义待发送到PC的数据的临时存储区大小 | 能缓存更多待发送数据,提高发送吞吐率,增加RAM占用 | 节省RAM,但可能导致发送API需等待或阻塞,降低实时性 |
cubemx直接生成即可。
MX_GPIO_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
CDC_Transmit_FS((uint8_t*)"hello", 5);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}


波特率可以自己设置。
注意:这个功能用cubemx实现几乎不用写任何代码,但是硬件上要做阻抗匹配,记得先检查D+口有没有1.5om上拉和D+D-串联22om,否则有可能出现无法识别设备,同时win10以下好像要去下载驱动,win10和win11无需驱动。
printf重定向
这部分代码放入usbd_cdc_if.c
#include <stdarg.h>
void usb_printf(const char *format, ...)
{
va_list args;
uint32_t length;
va_start(args, format);
length = vsnprintf((char *)UserTxBufferHS, APP_TX_DATA_SIZE, (char *)format, args);
va_end(args);
CDC_Transmit_HS(UserTxBufferHS, length);//这部分注意是不是transmit_fs或者hs
}
这样有一个问题就是不能连续发送。
修改版为阻塞发送。

int fputc(int ch, FILE *f)
{
uint8_t byte = (uint8_t)ch;
static uint32_t start_time;
start_time = HAL_GetTick();
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
while (hcdc->TxState != 0) {
if (HAL_GetTick() - start_time > 1000) break;
HAL_Delay(1);
}
CDC_Transmit_FS(&byte, 1);
return ch;
}
// printf的典型调用链
printf("Hello")
→ vfprintf(stdout, format, args)
→ _write(STDOUT_FILENO, buffer, length)
→ 底层驱动(你的实现)
高级函数: printf, fprintf, puts
↓
中级函数: fwrite, fputs
↓
基础函数: fputc, putc, putchar
↓
系统调用: _write, write
有改_write也是同理。
usbd_cdc_if.h放入头文件即可。
usb_printf CDC_Transmit_HS同时使用会出现%s出现问题,可能原因是CDC_Transmit_HS正常使用要提前写length,过长或者过短就会导致问题。
uint8_t UserTxBuffer[] = "here is usb_printf\r\n";
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
usb_printf("%s nihao\r\n",UserTxBuffer);
HAL_Delay(1000);

1563

被折叠的 条评论
为什么被折叠?



