我编写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){ / *!='\0'* /
if(UCSRA&(1<<UDRE)){
UDR=command;
command++;
}
}
}*/
/*
void UART_TX(char *command){
int i=0;
while(command[i]){ / *!='\0'* /
while(!(UCSRA&(1<<UDRE)));
UDR=command[i];
while(!(UCSRA&(1<<UDRE)));
i++;
}
}*/
发送“Hello World!”的结果几次(延迟1秒)是:
loWrd!
loWrd!
ELE] WRD!
el od!
el ol!
Hl ol!
HloWrd!
Hl ol!
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中断的“echo”功能时没有问题。
发生了什么事?
答案 0 :(得分:0)
通常,问题在于数据传输波特率。首先检查PC上的设置(它应该与MCU上的设置相同)。如果使用内部振荡器可能有缺陷,请尝试使用外部振荡器。