STM32 CDC_Transmit_FS:为什么在使用sprintf()或strcat()时出现“ \ x”?

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

在接收方,我正在使用readline()接收数据并将'string'解码为'int'

代码工作正常,但偶尔我会收到b'\ x00234 \ n'而不是b'1234 \ n',这会引起解码错误。

您知道为什么出现“ \ x”吗?

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

我想使传输更快。 预先感谢!

uint32_t adcbuff[sample];
char endofpacket[5] = {'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,"");

}
l6j8ttyy 回答:STM32 CDC_Transmit_FS:为什么在使用sprintf()或strcat()时出现“ \ x”?

没有足够的代表以发表评论

通常\x表示十六进制值。可能是正在接收非字母数字值吗? 为了进行故障排除,我会暂时更改

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

sprintf (tempbuff,"%s\n",((adcbuff[i] * 5000) / 0xFFFF)-2000);,以查看发送了哪种字符。 (也许是sprintf到tmp文件。)

,

b' \ x00 234 \ 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;
}

如果您想一次发送所有邮件,请对_IOFBF的 stdout 使用 setvbuf 并致电fflush(stdout);

本文链接:https://www.f2er.com/1285238.html

大家都在问