我需要通过UDR0寄存器为我的c#应用程序发送浮点数据。我能够在我的应用程序中读取它,但我无法使用UDR0发送浮点数据,因为UDR0是1字节(8位)寄存器,浮点数是4字节。
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
void setup()
{
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
UBRR0H = (uint8_t)(UBRR_VALUE>>8);
UBRR0L = (uint8_t)UBRR_VALUE;
UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); // Turn on the transmission, reception, and Receive interrupt
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
interrupts();
}
int c = 0;
float send_ ;
void loop()
{
}
ISR(USART_RX_vect)
{
cli();
while(!(UCSR0A&(1<<RXC0))){};
c= UDR0; // clear the USART interrupt
send_ = (c / 4);
UDR0 = send_;
sei();
}
答案 0 :(得分:0)
你应该读取4个字节(如果你发送二进制数据,如果你把它编码成一个nimber变量的字符串),使用一个union(有其他方式,但union是最简单的)将字节转换为float,将它除以4,然后发回4字节。
因为它是以指数格式存储的(参见IEE754),你可以只针对尾数进行存储,但它会非常复杂并且边际增益或没有增益。