簡體   English   中英

STM32 CDC_Transmit_FS:為什么在使用 sprintf() 或 strcat() 時會出現 '\\x'?

[英]STM32 CDC_Transmit_FS: why does '\x' appear when using sprintf() or strcat()?

我正在嘗試使用“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,"");

}

沒有足夠的代表發表評論

通常\\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;
}

如果您想一次發送所有內容,請使用setvbuf for stdout with _IOFBF 並調用 fflush(stdout);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM