收到一个字符串

时间:2014-06-19 10:43:17

标签: c string avr uart avr-studio5

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

enter image description here

与此图片相同我使用的波特率为9600.我尝试输入"abcdef",它只出现"abcf"

我的代码是这样的--->

#include <avr/io.h>

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个字母。我希望有人可以帮忙解决这个问题。 THANK。

2 个答案:

答案 0 :(得分:3)

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

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

当前的接收顺序如下:

  • Usart_Receive()正在等待第一个char&#39; a&#39;
  • 通过阅读立即清除UDR
  • 等待100毫秒(在此期间未读取UDR)
  • 在100ms延迟期间(记住发送5个字符只需要大约5ms)
    • &#39; B&#39;收到UDR
    • &#39; C&#39;正在等待第一个FIFO字节
    • &#39; d&#39;正在等待接收序列
    • &#39; E&#39;将覆盖&#39;
    • &#39; F&#39;将覆盖&#39; e&#39;
  • 在100分钟之后,你回应&#39; a&#39;
  • &#39; B&#39;从UDR中读取,&#39; c&#39;正在从FIFO字节移动到UDR和&#39; f&#39;正在转向第一个FIFO字节
  • 暂停100毫秒
  • echo&#39; b&#39;
  • &#39; C&#39;从UDR读取,&#39; f&#39;从FIFO字节移动到UDR
  • 暂停100毫秒
  • echo&#39; c&#39;
  • &#39; F&#39;从UDR中读取
  • 暂停100毫秒
  • 回声&#39; f&#39;

- &GT; ABCF

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

答案 1 :(得分:-2)

以下是有效的答案。

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;   
}

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