AVR UART String 传输(不是每个字符都传输)
AVR UART String transmission (not every char is transmited)
我编写了一个 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){ / *!='[=11=]'* /
if(UCSRA&(1<<UDRE)){
UDR=command;
command++;
}
}
}*/
/*
void UART_TX(char *command){
int i=0;
while(command[i]){ / *!='[=11=]'* /
while(!(UCSRA&(1<<UDRE)));
UDR=command[i];
while(!(UCSRA&(1<<UDRE)));
i++;
}
}*/
发送“Hello World!”的结果几次(延迟 1 秒)是:
loWrd!
loWrd!
elë]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”功能时没有问题。
怎么回事?
通常,问题出在数据传输波特率上。首先检查你PC上的设置(应该和MCU一样)。如果使用内部振荡器可能有缺陷,请尝试使用外部振荡器。
我编写了一个 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){ / *!='[=11=]'* /
if(UCSRA&(1<<UDRE)){
UDR=command;
command++;
}
}
}*/
/*
void UART_TX(char *command){
int i=0;
while(command[i]){ / *!='[=11=]'* /
while(!(UCSRA&(1<<UDRE)));
UDR=command[i];
while(!(UCSRA&(1<<UDRE)));
i++;
}
}*/
发送“Hello World!”的结果几次(延迟 1 秒)是:
loWrd!
loWrd!
elë]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”功能时没有问题。
怎么回事?
通常,问题出在数据传输波特率上。首先检查你PC上的设置(应该和MCU一样)。如果使用内部振荡器可能有缺陷,请尝试使用外部振荡器。