如何解决RX / TX串行通讯
我正在尝试与ATmega328P进行串行通信的概念。我对此很陌生,但这是我当前编写的代码。基本上,我们已经将来自串行通信的字符输入到ATmega芯片的RX中,并希望TX回传从串行终端发送的相同字符。我相信这段代码确实可以接收传输,但是我无法弄清楚为什么它不传输输入的字符。
int main(void)
{
/* For the microcontroller: set the baud rate to 19200 */
UBRR0 = 25;
/*
** Enable transmission and receiving via UART and also
** enable the Receive Complete Interrupt.
*/
// UCSR0A = (1<<RXC0)|(1<<UDRE0);
UCSR0B = (1<<RXCIE0)|(1<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0);
// Receiving data
// wait for data
while(!(UCSR0A & (1 << RXC0)));
// return data
return UDR0;
//Transmitting data
/* No need to set UCSR0C - we just want the default value */
/* Enable interrupts */
sei();
/* Sit back and let it happen - this will loop forever */
for (;;) {
}
}
/*
* Define the interrupt handler for UART Receive Complete - i.e. a new
* character has arrived in the UART Data Register (UDR).
*/
/*UART Register*/
ISR(USART0_UDRE_vect)
{
/* A character has been received - we will read it. If it is
** lower case,we will convert it to upper case and send it
** back,otherwise we just send it back as is
*/
char input;
/* Extract character from UART Data register and place in input
** variable
*/
UDR0 = input;
}
ISR(USART0_RX_vect) {
char input = UDR0;
printf_P(PSTR("%c"),input);
}
解决方法
您的代码没有意义。
1)
int main(void)
{
...
return UDR0;
这毫无意义:您要从main
返回到...哪里?实际上,当您退出主程序时,程序会通过进入死循环而暂停。
2)
ISR(USART0_UDRE_vect)
{
...
char input;
...
UDR0 = input;
}
您正在传输变量input
的内容。上面声明的内容仍未定义。您永远不会为变量分配任何内容。我敢打赌,编译器给了您很多警告。
3)
ISR(USART0_RX_vect) {
char input = UDR0;
printf_P(PSTR("%c"),input);
}
您对'printf'有什么期望。在MCU上运行时,应在哪里打印结果?
实际上,代码可能更简单
int main(void)
{
// Sets 19200 only when MCU is running at 8MHz
UBRR0 = 25;
// enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
for(;;) { // infinite loop
// Receiving data
// wait for data
while(!(UCSR0A & (1 << RXC0)));
// read the data byte from the the receiver buffer
unsigned char data = UDR0;
// Wait for the transmitting buffer to be empty
while(!(UCSR0A & (1 << UDRE0)));
// Send the data
UDR0 = data;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。