如何在uart中接收字符串。我正在使用avr studio 5和brays终端这样的
与此图片相同我使用的波特率为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。
答案 0 :(得分:3)
正如已经指出的评论之一,您声明USART_Receive
,但请致电Usart_Receive
。这不应该编译(至少没有警告),因为C区分大小写。您还应该将返回值更改为char或uint8_t。
您只收到/回复问题的实际原因&#39; abcf&#39;当你实际发送&#39; abcdef&#39;可能是_delay_ms(100);
。传输一个字符@ 9600波特大约需要1ms
AVR控制器仅在接收端提供一个非常小的FIFO(一个或两个字节),如果UDR寄存器在适当的时间间隔后未被读出(显然取决于传输速度),它将溢出。
当前的接收顺序如下:
- &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;
}
感谢那些在此之前帮助我的人。