收到一个字符串

如何在uart中接收字符串。 我正在使用avr studio 5和brays终端这样的

在此处输入图像描述

和这张图片一样,我使用9600的波特率。我尝试输入"abcdef" ,它只出现"abcf"

我的代码是这样的—>

 #include  void serial_init(void) { UBRRH = 0x00; UBRRL = 95; //baudrate 9600 and F_CPU 14745600UL UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE); UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)|(1 << UCSZ1); } unsigned long long Usart_Receive(void) { while((UCSRA & (1 << RXC)) == 0) {}; return UDR; } void USART_Transmit(unsigned long c) { PORTD= 0b00000100; //RTS Enable while ((UCSRA & (1 << UDRE)) ==0) {}; UDR = c; PORTD= 0b00000000; //RTS Disable } int main(void) { unsigned char data; serial_init(); while (1) { data = Usart_Receive(); _delay_ms(100); USART_Transmit(data); } return 0; } 

很简单,但我找不到我的问题为什么它只在终端出现4个字母。 我希望有人可以帮忙解决这个问题。 谢谢。

正如已经指出的评论之一,您声明USART_Receive但是调用Usart_Receive 。 这甚至不应该编译(至少没有警告),因为C区分大小写。 您还应该将返回值更改为char或uint8_t。

实际发送’abcdef’时,你只收到/ echo’abcf’的问题的实际原因可能是_delay_ms(100); 。 传输字符@ 9600波特大约需要1ms。
AVR控制器仅在接收侧提供非常小的FIFO(一个或两个字节),如果在适当的时间间隔后未读出UDR寄存器(显然取决于传输速度),它将溢出。

当前的接收顺序如下:

  • Usart_Receive()正在等待第一个char’a’
  • UDR会立即通过阅读清除
  • 等待100ms(在此期间不读取UDR)
  • 在100ms延迟期间(记住发送5个字符只需要大约5ms)
    • “b”被收到UDR
    • ‘c’在第一个FIFO字节中挂起
    • ‘d’在接收序列中待定
    • ‘e’会覆盖’d’
    • ‘f’会覆盖’e’
  • 在100ms后你回响’a’
  • 从UDR读取’b’,’c’从FIFO字节移动到UDR,’f’移动到第一个FIFO字节
  • 暂停100毫秒
  • 回声’b’
  • 从UDR读取’c’,’f’从FIFO字节移动到UDR
  • 暂停100毫秒
  • 回声’c’
  • 从UDR读取’f’
  • 暂停100毫秒
  • 回声’f’

– > abcf

您必须确保至少每毫秒轮询一次UDR。 另一种解决方案是基于中断的方法,您可以在相应的ISR中处理每个接收到的字符,而不会有主要代码阻止UDR读数的风险。

以下是有效的答案。

 int main(void) { char data[1][40]; int i1 = 0; int i2 = 0; serial_init(); while (1) { for (i1=0;i1<1;i1++) { for (i2=0;i2<40;i2++) { data[i1][i2] = Usart_Receive(); } } for (i1=0;i1<1;i1++) { for (i2=0;i2<40;i2++) { Usart_Transmit(data[i1][i2]); } } } return 0; } 

感谢那些在此之前帮助我的人。