0002-20200314-AVR 串口通讯接收数据后会发送已发送过的数据

  • Post author:
  • Post category:其他


RXCIE0(接收结束中断使能)使能状态下会出现,PC发数据,单片机发送while()函数前发送的字符串,始终进不去串口中断—还在研究中,没整明白

还在进行中

先不用中断凑合着先用

下一步识别字符串

将RXCIE0(接收结束中断使能)使能关闭;

单纯使用RXEN0使能 接收数据;

读取到单一字符识别并反馈字符串表明通讯成功

#include <asf.h>

/***********************************宏定义**********************************/
#define fosc 8000000 //晶振8MHZ
#define baud 9600	 //波特率
/****************************************************************************
函数功能:uart0初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart0_init(void)  //初始化COM0
{
	UCSR0B = 0x00;
	UCSR0A = 0x00;
	UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//8bit+1bit stop
	UBRR0L=(fosc/16/(baud+1))%256;
	UBRR0H=(fosc/16/(baud+1))/256;
	UCSR0B =(1<<RXEN0)|(1<<TXEN0);//|(1<<RXCIE0);
}

/****************************************************************************
函数功能:uart0发送单字节数据
入口参数:c
出口参数:
****************************************************************************/
void putchar(unsigned char c)
{	
	/* 等待发送缓冲器为空 */
	while ( !( UCSR0A & (1<<UDRE0)) );
	/* 将数据放入缓冲器,发送数据 */
	UDR0 = c;	
}

unsigned char getchar0(void)
{
	while(!(UCSR0A& (1<<RXC0)));
	return UDR0;
}

/****************************************************************************
函数功能:uart0发送字符串数据
入口参数:*s
出口参数:
****************************************************************************/
void puts(char *s)     //发送字符串函数
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
	putchar(0x0a);  //发送结束字符
	putchar(0x0d);  //发送结束字符
}

/****************************************************************************
函数功能:初始化单片机
入口参数:
出口参数:
****************************************************************************/
void init_devices(void)
{
	cli(); //关闭所有中断
	XDIV  = 0x00;
	XMCRA = 0x00;
	MCUCR = 0x00;
	EICRA = 0x00;
	EICRB = 0x00;
	EIMSK = 0x00;
	TIMSK = 0x00;
	ETIMSK = 0x00;
}

void delay_us(unsigned int microsecond)
{
	do
	{
		microsecond--;
	}
	while (microsecond>1);
}

void delay_ms(unsigned int millisecond)
{
	while (millisecond--)
	{
		delay_us(999);
	}
}


int main (void)
{
	unsigned int i;
	
	init_devices();
	uart0_init();

	puts("pc");
	
	while(1)
	{
		if (getchar0()=='t')//按键盘t键开始测试
		{
			
			puts("getchar0");
			for (i=0;i<10;i++)
			{
				putchar(0x30+i);
			}
			putchar(0x0a);
			putchar(0x0d);
		}		
	}
}



版权声明:本文为mjc1321原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。