debugging STM32通过USB CDC打印

vx6bjr1n  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(139)

目前我正在开发软件,我被卡住了。我需要帮助
我正在使用STM32F103,HAL和library FreeRTOS
我写了一个小的串行调试器函数,通过UARTUSB CDC发送字符。
以下是我的定义:
在头文件中:

#if ( DEBUG == DEBUG_ENABLE )
    /* printf definition */
    #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[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]测试
字符串
所以我什么都不明白。会是什么呢?

pengsaosao

pengsaosao1#

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

PUTCHAR_PROTOTYPE
{
    //while(!(CDC_Transmit_FS((uint8_t*)&ch, 1) == USBD_OK))
    //    ;
    while(!(CDC_Transmit_FS((uint8_t*)&ch, 1) == USBD_BUSY))
        ;

    return ch;
}

原因可能是,当第二个字符传递给函数时,第一个字符仍在路上,因此第二个字符被丢弃,因为线路繁忙。我不确定这是不是你的问题。
添加超时检查以避免无限循环可能很有用。

相关问题