我在ATmega328P微控制器上遇到USART通信问题,希望能提供一些调试方面的帮助.
我面临的问题如下: 我在ATmega328P微控制器上实现了USART通信,通过串行传输字符串"HE".但是,当使用以下代码片段时,串行控制台上的输出重复"H H H H. "没完没了:
#define FOSC 16000000UL
#define BAUD 9600
#define UBRR FOSC/16/BAUD-1
void USART_init(unsigned int ubrr)
{
// Setting Baud rate
UBRR0H = (unsigned char)(ubrr >> 8);
UBRR0L = (unsigned char)ubrr;
//Enable receiver and transmitter
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
//Set frame format: 8data, 2stop bits
UCSR0C = (1 << USBS0) | (1 << UCSZ00) | (1 << UCSZ01);
return;
}
void USART_Transmit(unsigned char data)
{
while(!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
return;
}
void print_serial(char* data)
{
USART_Transmit(data[0]);
USART_Transmit(data[1]);
USART_Transmit(data[2]);
return;
}
int main()
{
USART_init(UBRR);
print_serial("HE");
return 0;
}
但是,当使用以下修改后的代码片段时,输出与预期相同,只打印一次"HE":
#define FOSC 16000000UL
#define BAUD 9600
#define UBRR FOSC/16/BAUD-1
void USART_init(unsigned int ubrr)
{
// Setting Baud rate
UBRR0H = (unsigned char)(ubrr >> 8);
UBRR0L = (unsigned char)ubrr;
//Enable receiver and transmitter
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
//Set frame format: 8data, 2stop bits
UCSR0C = (1 << USBS0) | (1 << UCSZ00) | (1 << UCSZ01);
return;
}
void USART_Transmit(unsigned char data)
{
while(!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
return;
}
void print_serial()
{
char *data = "HE";
USART_Transmit(data[0]);
USART_Transmit(data[1]);
USART_Transmit(data[2]);
return;
}
int main()
{
USART_init(UBRR);
print_serial();
return 0;
}
当将字符串"HE"作为参数传递给print_serial函数时,似乎会出现这个问题.但是,当函数本身定义字符串时,输出是正确的.
有人可以帮助我确定这个问题的根本原因,并建议任何潜在的修复方案?
提前感谢您的帮助.
Observation: 似乎有一个问题与字符串的作用域有关.为字符串分配内存可以在串行控制台上打印正确的输出"HE".
{
USART_init(UBRR);
char *data = (char*)malloc(3);
data[0] = 'H';
data[1] = 'E';
data[2] = '\0';
print_serial(data);
free(data);
return;
}