Serial port Atmega 2560 USART未在终端上给出正确的值

Serial port Atmega 2560 USART未在终端上给出正确的值,serial-port,avr,serial-communication,atmega,usart,Serial Port,Avr,Serial Communication,Atmega,Usart,我正在研究基于atmega2560的MultiWii Pro板的串行通信。我正在使用AVRCC进行编译,并使用avrdude进行编程 这是我的问题。我正试图让atmega2560发送一些东西(十六进制值)到终端。但是,无论分配给UDR2的值是多少,也不管我分配给UBRR2L和UBRR2H的值是多少,如果我将终端波特率设置为9600,则终端输出始终为0xff,如果我将终端波特率设置为115200,则终端输出始终为0xff 这是我的密码 #define F_CPU 8000000UL #define

我正在研究基于atmega2560的MultiWii Pro板的串行通信。我正在使用AVRCC进行编译,并使用avrdude进行编程

这是我的问题。我正试图让atmega2560发送一些东西(十六进制值)到终端。但是,无论分配给UDR2的值是多少,也不管我分配给UBRR2L和UBRR2H的值是多少,如果我将终端波特率设置为9600,则终端输出始终为0xff,如果我将终端波特率设置为115200,则终端输出始终为0xff

这是我的密码

#define F_CPU 8000000UL
#define BAUDRATE 19200        //The baudrate to use
#define BAUD_PRESCALLER ((F_CPU / (BAUDRATE * 16UL))-1)

static void InitializeUART()
{
    UBRR2L = (uint8_t)(BAUD_PRESCALLER);                               
    UBRR2H = (uint8_t)(BAUD_PRESCALLER>>8);
    UCSR2B |= (1<<RXEN2) | (1<<TXEN2);          //RX TX  Enable
    UCSR2C |= (1<<USBS2)|(1<<UCSZ21)|(1<<UCSZ20);
}

UCSR2C |=(1我假设您检查了帧格式(奇偶校验、停止位、流控制等)在终端端?这是我在终端端的帧格式:波特率:19200,数据位:8,流量控制:无,奇偶校验:无,停止位:1。尽管如此,无论奇偶校验位和停止位的设置如何,输出总是相同的。这不是您配置的帧(请参阅我的答案)。如果您保留代码并设置波特率:19200,数据位:9,流量控制:无,奇偶校验:无,停止位:2,会发生什么?我尝试了您的配置。输出值没有更改。因此,我通过删除将代码更改为发送8个数据位,而不是9个数据位(1)无论您的具体设置如何,在初始测试中都应尽量保持简单。如何从atmega2560连接到终端(这是PC上的终端软件)?这可能是逻辑电平问题。可能atmega2560侧有UART TTL输出,并直接与RS232连接?
void USART2Write(char data)
{
    while( !(UCSR2A & (1<<UDRE2)));

    UCSR2B &= ~(1<<TXB82); //in the case if there are more than 8 bits of data
    if(data & 0x100)
    {
        UCSR2B |= (1 << TXB82);    
    }

    UDR2 = data;
}
Low     High    Extended
0xFF    0xD8    0xFD
UCSR2C |= (1<<USBS2)|(1<<UCSZ21)|(1<<UCSZ20);
void USART2Write(char data){
    while( !(UCSR2A & (1<<UDRE2)));

    UCSR2B &= ~(1<<TXB82); //in the case if there are more than 8 bits of data
    if(data & 0x100) {
        UCSR2B |= (1 << TXB82);    
    }

    UDR2 = data;
}
UCSR2C |= (1<<USBS2) | (1<<UCSZ21) | (1<<UCSZ20);
static void InitializeUART() {
    UBRR2L = (uint8_t)(BAUD_PRESCALLER);                               
    UBRR2H = (uint8_t)(BAUD_PRESCALLER>>8);
    UCSR2B |= (1 << RXEN2) | (1 << TXEN2) | (1 << UCSZ22);
    UCSR2C |= (1 << UCSZ21) | (1 << UCSZ20);
}