问题描述
我正在尝试使用“ 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,"");
}
解决方法
没有足够的代表以发表评论
通常\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);