stm32 printf over usb cdc

时间:2018-04-13 15:17:55

标签: debugging usb stm32 cdc

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

我正在使用stm32f103,hal和库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_MSG(MAIN_DEBUG, "Gsm manager thread started!"); 当调试器端口是uart_debug时,根本没有问题。一切都运行得很好。

但每当我选择usb_debug端口时,都会有一些事情在讨厌。

虽然调试端口是usb cdc,但我得到的文字如下:

  

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

但是在调试模式下,在putc函数中,我在CDC_Transmit_FS((uint8_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 [0test

的字符串。

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

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;
}

原因可能是当第二个字符传递给函数时,第一个字符仍在途中,因此第二个字符由于该行繁忙而被丢弃。我不确定这是否是您的问题。

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

致谢。