C PuTTY未向AVR串行发送数据

C PuTTY未向AVR串行发送数据,c,avr,atmega,C,Avr,Atmega,在我的嵌入式编程课程的练习中,我们必须对Atmega328p AVR芯片进行编程,以通过串行端口接收数据。我们必须通过调用一个函数来实现这一点,该函数将一直等到收到一个char。下一步,它应该在led灯中显示该字符的ascii值,但我甚至无法接收到它。我已经做了很多调试,我想我把范围缩小到PuTTY甚至没有发送数据,或者AVR没有正确接收数据。我将把我的代码放在下面: /* From the PC should come a char, sent via the serial port to t

在我的嵌入式编程课程的练习中,我们必须对Atmega328p AVR芯片进行编程,以通过串行端口接收数据。我们必须通过调用一个函数来实现这一点,该函数将一直等到收到一个char。下一步,它应该在led灯中显示该字符的ascii值,但我甚至无法接收到它。我已经做了很多调试,我想我把范围缩小到PuTTY甚至没有发送数据,或者AVR没有正确接收数据。我将把我的代码放在下面:

/*
From the PC should come a char, sent via the serial port to the USART data register. 
It will arrive in the RXB, which receives data sent to the USART data register. 
While running the loop, the program should encounter a function that is called and waits for the RXB to be filled. 
Then it will read the RXB and return it to the main loop.
The result will be stored and processed accordingly.
*/

#define F_CPU 15974400
#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>

void writeChar(char x);
void initSerial();
char readChar();

int main(void)
{
    initSerial();
    while (1) 
    {
        char c = readChar(); //reads char, puts it in c
        _delay_ms(250); //waits

        writeChar(c); // spits that char back into the terminal
    }
}

void initSerial(){
UCSR0A = 0;
//UCSR0B = (1 << TXEN0); // Enable de USART Transmitter
UCSR0B = 0b00011000; //transmit and receive enable
//UCSR0C = (1 << UCSZ01) | (0 << UCSZ00); /* 8 data bits, 1 stop bit */
UCSR0C = 0b00100110; // Even parity, 8 data bits, 1 stop bit
UBRR0H=00;
UBRR0L=103; //baudrade 9600 bij
}

void writeChar(char x){
    while(!(UCSR0A & (1 << UDRE0))); // waits until it can send data
    UDR0 = x; // Puts x into the UDR0, outputting it
}

char readChar(){
    while (!(UCSR0A & (1 << RXC0))); //waits until it can send data
    return UDR0; // returns the contents of the UDR0 (the receiving part of course
}
/*
PC应提供一个字符,通过串行端口发送到USART数据寄存器。
它将到达RXB,RXB接收发送到USART数据寄存器的数据。
在运行循环时,程序应该遇到一个被调用的函数,并等待RXB被填充。
然后,它将读取RXB并将其返回到主循环。
结果将被相应地存储和处理。
*/
#定义F_CPU 15974400
#包括
#包括并似乎是重要的屏幕


提前谢谢,我完全没有主意了。

我自己修好了。我把它拿下楼在另一台笔记本电脑上测试时发现了它。我仍然在PORTD的所有管脚中放置了LED,全部处于输入模式(这是默认模式)。我快速查看(第2.5.3节)发现,引脚D0实际上是USART的RxD in。通过在其上放置一个LED并有效地将其接地,它总是被拉低,而CPU永远不会将其放高,这将停止while循环检查
while(!(UCSR0A&(1我自己修复了它。我在下楼在另一台笔记本电脑上测试它时发现了它。我仍然在PORTD的所有引脚中放置了LED,全部处于输入模式(这是默认模式)。我快速查看(第2.5.3节)发现,引脚D0实际上是USART的RxD in。通过在其上放置一个LED并有效地接地,它总是被拉低,CPU永远不会将其放高,这将停止while循环检查
while(!(UCSR0A&(1)您是否尝试了8-N-1而不是8-E-1(9位模式)?据我所知,Atmega328p没有9位模式。据我所知,Atmega328p没有9位模式。因此,8-E-1在两端的设置都是错误的。好的,我已经解决了。但事实证明,这根本不是问题。似乎仍然有一个LED连接到端口D0引脚,有效地将其接地,从而使其无法正常工作不起作用。快速查看数据表发现PD0是USART的RxD端口。这就是它不起作用的原因。@QuentensChooterWoord请回答这个问题,并在允许的情况下稍后标记。您是否尝试过8-N-1而不是8-E-1(9位模式)?据我所知,Atmega328p没有9位模式。据我所知,Atmega328p没有9位模式。因此,8-E-1在两端的设置都是错误的。好的,我已经解决了。但事实证明,这根本不是问题。似乎仍然有一个LED连接到端口D0引脚,有效地将其接地,从而使其无法正常工作不起作用。快速查看数据表发现PD0是USART的RxD端口。这就是它不起作用的原因。@QuentensChooterWoord请回答这个问题,并在允许的情况下标记它。因此,既然PuTTY实际上是在向AVR发送数据,但您只是遇到了一个硬件问题,我建议重命名这个问题。或者干脆删除它。阅读数据表应该是你做的第一件事,而不是最后一件事。只要看一下数据表开头的引脚图,这就不是问题了。因此,既然PuTTY实际上是在向AVR发送数据,但你只是遇到了硬件问题,我建议重命名问题。或者干脆删除它。阅读数据表应该是最好的选择首先要做的事情,而不是最后一件。只要看一下数据表开头的引脚图,这就不是问题了。