AVR UART字符串传输(并非每个字符都传输)



我对AtMega 32 UART模块进行编程。我试图用我的函数发送字符串,但它的工作方式非常特殊。通常,它会从该字符串中发送一些字符。有些,而不是全部。我用三种不同的方式编写函数,每次都得到相同的结果。我使用RS232/USB转换器来检查它是如何工作的。

这是我的程序,下面是传输的结果。

#define F_CPU 8000000
#include <avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#include<string.h>
#define BAUD_RATE 19200
#define BAUD_PRESCALER (((F_CPU / (BAUD_RATE * 16UL))) - 1) 
static void BAUD_SETTINGS(){
    UBRRH=(BAUD_PRESCALER>>8);
    UBRRL=BAUD_PRESCALER;
}
static void TRANSMIT_SETTINGS(){
    UCSRB=(1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
    UCSRC=(1<<UCSZ0) | (1<<UCSZ1) | (1<<URSEL);
}
   
void UART_TX(unsigned char znak);
void UART_String_TX(char *command);
//MAIN//
int main(void)
{
    
    BAUD_SETTINGS();
    TRANSMIT_SETTINGS();
        
    DDRA=0xff;
    PORTA=0xff;
    PORTD=0x02;
    sei();
    
    _delay_ms(1500);
    for(;;){
        PORTA=0xff;
        UART_String_TX("Hello World!");
        _delay_ms(1000);
    }
}
void UART_TX(unsigned char znak){
    while(!(UCSRA & (1<<UDRE)));
    UDR = znak;
}
void UART_String_TX(char *command){
    
while(*command != 0x00){
    UART_TX(*command);
command++;}
}
    
ISR(USART_RXC_vect){
    char RXC_byte;
    RXC_byte=UDR;
    UDR=RXC_byte;
    PORTA=0x00;
}

发送函数还有另外两种变体,但其工作原理相同。

/*
    void UART_TX(char *command){
        
        while(*command){            / *!=''* /
            if(UCSRA&(1<<UDRE)){
                UDR=command;
                command++;
            }
        }
    }*/
    /*
    void UART_TX(char *command){
        int i=0;
            while(command[i]){          / *!=''* /
                while(!(UCSRA&(1<<UDRE)));
                UDR=command[i];
                while(!(UCSRA&(1<<UDRE)));
                i++;
                        
        }
    }*/

发送结果";你好,世界"几次(延迟1秒)是:

loWrd!

loWrd!

elë]Wrd!

哦!

el ol!

哦!

HloWrd!

哦!

HloWr!

HloWo#'!

该字符的内存地址是(来自其他文本):

97 99 101 103 104 106 108 110 112 113 115 117

96 98 100 102 104 106 107 109 111 113 114 116 117

96 98 99 101 103 105 107 108 110 111 113 115 117

当我使用";回声;功能与RXC中断。

怎么回事?

通常,问题在于波特率的数据传输。首先检查你电脑上的设置(它应该与MCU上的设置相同)。如果你使用内部振荡器,它可能有缺陷,试着使用外部振荡器。

相关内容

  • 没有找到相关文章

最新更新