在ATMEGA32中使用USART发送十进制

时间:2015-12-22 06:47:49

标签: avr avr-gcc usart winavr

我在通过USART发送串行数据时遇到问题,它发送的ASCII不是小数。

这是我的代码:

    while(!(UCSRA&(1<<UDRE))){}
    UDR=12;

这是标题:

UBRRH=(uint8_t) (UBRR_CALC>>8);
UBRRL=(uint8_t) (UBRR_CALC);
UCSRB=(1<<TXEN)|(1<<RXEN);
UCSRC=(1<<URSEL)|(3<<UCSZ0);

如何发送十进制数据,我想从ADC读取并使用USART发送...

非常感谢

2 个答案:

答案 0 :(得分:1)

在不丢失所有数据的情况下,您无法将float之类的十进制数转换为char。但是,您只想公开这些位,以便通过USART发送它们,然后返回小数值。您可以通过union

执行此操作
union FloatChar {
    float f;
    char c[4]; // or however big a float is on your compiler
};

然后您可以像

一样使用它
union FloatChar fc;
fc.f = adc.getValue();
usart.send(fc.c);

并使用相同的union将它转换为浮点数,当它到达连接的另一端时。

答案 1 :(得分:0)

如果'decimal'表示数字的字符串表示,则应该查看sprintfitoa

您需要一个字符缓冲区,可以使用其中一个函数填充字符缓冲区,并使用表示您的编号的字符串。

请阅读有关不同基本数据类型的C-Tutorial或书籍,尤其是字符/字符串与整数数据类型之间的区别。