STM32 CDC_Transmit_FS:为啥在使用 sprintf() 或 strcat() 时会出现 '\x'?

Posted

技术标签:

【中文标题】STM32 CDC_Transmit_FS:为啥在使用 sprintf() 或 strcat() 时会出现 \'\\x\'?【英文标题】:STM32 CDC_Transmit_FS: why does '\x' appear when using sprintf() or strcat()?STM32 CDC_Transmit_FS:为什么在使用 sprintf() 或 strcat() 时会出现 '\x'? 【发布时间】:2021-02-16 05:39:40 【问题描述】:

我正在尝试使用“CDC_Transmit_FS()”通过 USB 从 ADC 发送值

在接收端,我使用 readline() 接收数据并将“字符串”解码为“int”

代码运行良好,但有时我会收到例如 b'\x00234\n' 而不是 b'1234\n',这会引发解码错误。

你知道为什么会出现'\x'吗?

还有一个问题:有没有更聪明的方法通过 USB 发送 ADC 值而不是将 int 值转换为字符串?

我想让传输更快。 提前致谢!

uint32_t adcbuff[sample];
char endofpacket[5] = '9', '9', '9', '9', '\n';
char txbuff[sample*5];

while(1)


    HAL_ADC_Start_DMA(&hadc2,(uint32_t*)adcbuff, sample);

    for(i = 0; i < sample; i++)
    
     sprintf (tempbuff,  "%u\n", ((adcbuff[i] * 5000) / 0xFFFF)-2000); 
     strcat( txbuff,tempbuff);
    
        
    strcat( txbuff,endofpacket);
    CDC_Transmit_FS( (uint8_t*)txbuff, strlen(txbuff));  
    strcpy(txtbuff,"");


【问题讨论】:

【参考方案1】:

b'\x00234\n' - 这意味着第一个字节是 0!不是 ASCII 0 = 0x30,而是 0。 可能这是 strcat 的效果 - 连接此函数后,在字符串末尾添加 '\0'。

不使用 sprintf,只需将 stdout 重定向到 USB-CDC 并使用 printf:

int _write(int file, char *ptr, int len)

    UNUSED(file);
    CDC_Transmit_FS((uint8_t*)ptr, len);
    while (hcdc->TxState != 0);
    return len;

如果您想一次性发送所有内容,请使用 setvbuf for stdout 和 _IOFBF 并调用 fflush(stdout);

【讨论】:

【参考方案2】:

没有足够的代表发表评论

通常\x 表示十六进制值。是否正在接收非字母数字值? 为了解决问题,我会暂时更改

sprintf (tempbuff, "%u\n", ((adcbuff[i] * 5000) / 0xFFFF)-2000);

sprintf (tempbuff, "%s\n", ((adcbuff[i] * 5000) / 0xFFFF)-2000); 查看发送过来的字符类型。 (也许 sprintf 改为 tmp 文件。)

【讨论】:

感谢奥加尔的回答!我会尝试并带着结果再来一次:D

以上是关于STM32 CDC_Transmit_FS:为啥在使用 sprintf() 或 strcat() 时会出现 '\x'?的主要内容,如果未能解决你的问题,请参考以下文章

stm32 为啥要用freertos

stm32为啥都用软件模拟协议

为啥 STM32CubeIDE 有 2 个生成的链接器脚本?

stm32为啥有内部晶振和外部晶振

stm32的I2C为啥会有bug

stm32f4为啥没人用