Debugging Stm32 printf over usb cdc

Debugging Stm32 printf over usb cdc,debugging,usb,stm32,cdc,Debugging,Usb,Stm32,Cdc,目前我正在开发一个软件,我被卡住了。我需要一些帮助 我正在使用stm32f103、hal和library freertos 我写了一个小的串行调试器功能,它通过uart或usb cdc发送字符 以下是我的定义: 在头文件中: #if ( DEBUG == DEBUG_ENABLE ) /* printf definetion */ #define DEBUG_MSG( FLAG, fmt, ...)

目前我正在开发一个软件,我被卡住了。我需要一些帮助

我正在使用stm32f103、hal和library freertos

我写了一个小的串行调试器功能,它通过uart或usb cdc发送字符

以下是我的定义:

在头文件中:

#if ( DEBUG == DEBUG_ENABLE )
    /* printf definetion */
    #define DEBUG_MSG( FLAG, fmt, ...)                                                                          
    do
    {
        if( FLAG )
            printf( "[%08d]%s:%d:%s(): " fmt "\r\n", HAL_GetTick(), __FILE__, __LINE__, __func__, ##__VA_ARGS__);
    }while( 0 );
#else
    #define DEBUG_MSG( FLAG, fmt, ... )
#endif
在c文件中:

#define PUTCHAR_PROTOTYE int fputc( int ch, FILE *f )

PUTCHAR_PROTOTYE
{
#if DEBUG_PORT == USB_DEBUG
    CDC_Transmit_FS((uint8_t *)&ch, 1);
#elif DEBUG_PORT == UART_DEBUG
    HAL_UART_Transmit( pDEBUG_PORT, ( uint8_t * )&ch, 1, 0xFFFF );
#else
    #error "Define a debug port!"
#endif
    return ch;
}
我这样使用:
DEBUG\u MSG(MAIN\u DEBUG,“Gsm管理器线程已启动!”)
当调试器端口为uart\U debug时,根本没有问题。一切运转正常

但每当我选择usb_调试端口时,就会发生一些事情

当调试端口是usb cdc时,我得到如下文本:

“[0[0[0[0]6”

但在调试模式下,在putc函数中,我在
CDC\u Transmit\u FS((uint8\u t*)&ch,1);
行上放置一个断点,然后按F5,我得到:

[00010046]../Src/main.c:633:gsmmanager_handler():Gsm管理器线程已启动

字符串和我期望的一样。如果我把
CDC_Transmit_FS((uint8_t*)“test”,strlen(“test”);
行放在
CDC_Transmit_FS((uint8_t*)&ch,1);
后面,我得到:

[0[0测试

绳子


所以我什么都不懂。可能是什么?

你在寻找答案吗

我确实写了下面的代码,它为我运行:

PUTCHAR_PROTOTYPE  
{
    //while(!(CDC_Transmit_FS((uint8_t*)&ch, 1) == USBD_OK));
    while(!(CDC_Transmit_FS((uint8_t*)&ch, 1) == USBD_BUSY));
    return ch;
}
原因可能是当第二个字符被传递到函数时,第一个字符仍在传递过程中,因此第二个字符被丢弃,因为线路忙。我不确定这是否是您的问题

添加超时检查以避免无限循环可能很有用


问候。

非常感谢。我还没有测试它。dma usb呢?