Serial port 接收/发送串行通信

Serial port 接收/发送串行通信,serial-port,atmega,rxtx,Serial Port,Atmega,Rxtx,我试图处理与ATmega328P串行通信的概念。我对此很陌生,但这是我目前编写的代码。基本上,我们已经将串行通信中的一个字符输入到ATmega芯片的RX中,并希望TX发送回从串行终端发送的相同字符。我相信此代码确实接收到传输,但我无法理解它为什么不传输输入的字符 int main(无效) { /*对于微控制器:将波特率设置为19200*/ UBRR0=25; /* **通过UART和 **启用接收完整中断。 */ //UCSR0A=(1在代码中没有意义 (一) 这毫无意义:您正在从main返回到

我试图处理与ATmega328P串行通信的概念。我对此很陌生,但这是我目前编写的代码。基本上,我们已经将串行通信中的一个字符输入到ATmega芯片的RX中,并希望TX发送回从串行终端发送的相同字符。我相信此代码确实接收到传输,但我无法理解它为什么不传输输入的字符

int main(无效)
{
/*对于微控制器:将波特率设置为19200*/
UBRR0=25;
/*
**通过UART和
**启用接收完整中断。
*/

//UCSR0A=(1在代码中没有意义

(一)

这毫无意义:您正在从
main
返回到…何处?实际上,当您退出主例程时,程序会因进入死循环而停止

(二)

您正在传输变量
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; 
    }

}
int main(无效)
{
//仅当MCU以8MHz频率运行时设置19200
UBRR0=25;
//启用接收器和发射器
UCSR0B=(1)
ISR(USART0_UDRE_vect)
{
...
    char input;
...
    UDR0 = input;
}
ISR(USART0_RX_vect) {
    char input = UDR0;
    printf_P(PSTR("%c"), input);
}
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; 
    }

}