为什么我的 USB 通信冲刺不能很好地工作?



我想将双表单uC发送到PC。例如:在uC中,我将它发送到PC后有双精度pi = 3.1415,控制台(在PC上)应显示3.1415。我需要将双精度转换为字符,所以我使用 sprintf() 来转换它。老实说,我不确定 sprintf() 是否将 double 转换为 char[],但这是我唯一的想法。将 pi 发送到 PC 后,我的控制台显示:?<00><00>4f<00> ̇ ̇ ̇ .有我的代码:

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
void print_char(char letter)
{
if( bit_is_set(UCSRA, UDRE) )
{
_delay_ms(10);
UDR=letter;
loop_until_bit_is_set(UCSRA, TXC);
}
}
int main(void)
{
UBRRL = 103; //9600 16mhz
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
double pi=3.1415;
char cpi[8];
sprintf(cpi,"%#.4f", pi);
while(1)
{
for(int i=0; i<8; i++) print_char(cpi[i]);
UDR=0x0D;
UDR=0x0A;
_delay_ms(1000);
}
}

如何修复它,或者如何正确将双精度转换为 char[]。

sprintf和朋友的成本很高,尤其是具有浮点支持的完整版本。 为此,avr-libc 提供了不同版本的vfprintf,其中默认版本不支持float,如果看到?,则只打印

。如果您需要浮动支持,请使用

avr-gcc ... -Wl,-u,vfprintf -lprintf_flt

参见AVR-libc:VFPprintF。 此外,在 stdlib.h 中还支持普通浮点转换函数。

在极少数情况下,您使用的avr-gcc支持64位double:avr-libc不支持它们,无论您链接的是哪个版本的vfprintf

相关内容

最新更新