⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 ATMEG162获得GPS定位数据的程序
💻 C
字号:
#include<avr/io.h>
#include<avr/signal.h>
#include <avr/delay.h>
#include "self_def.h"
#include "head.h"

#define TxBuf_Size 32
#define RxBuf_Size 64
#define TxBuf_Mask (TxBuf_Size-1)
#define RxBuf_Mask (RxBuf_Size-1)
volatile unsigned char UART0_TxHead;	//发送buf头index
volatile unsigned char UART0_RxHead;	//接收buf头index
volatile unsigned char UART0_TxTail;	//发送buf尾index
volatile unsigned char UART0_RxTail;	//接收buf尾index
uchar UART0_TxBuf[TxBuf_Size];
uchar UART0_RxBuf[RxBuf_Size];

void init_UART0(void)
{
	//set Baud Rate=BAUD
	UBRR0H=0x00;
	UBRR0L=0x0C; 
	UCSR0A=0;
	//Enable recerver interrupt,transmit and receiver
	UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
	UCSR0C=(1<<URSEL0)|(1<<UCSZ01)|(1<<UCSZ00);
	//SREG|=(1<<SREG_I);
	//sei();		//总中断允许
	UART0_TxHead=0;
	UART0_RxHead=0;
	UART0_TxTail=0;
	UART0_RxTail=0;
}

// USART0 Transmit Complete interrupt
/***************************
SIGNAL(SIG_USART0_TRANS)
{
	//add code
}
***************************/
//USART0 RESCEIVE Complete interrupt
SIGNAL(SIG_USART0_RECV)
{
	unsigned char data;
	unsigned char tmphead;
	data = UDR0; /* read the received data */
	if(data==0x0A)
		//RxCom_Flag=1;	//一组数据接收完成,完成标志位置1
	{
		PORTD|=(1<<PD2);
		//display_word(14,8,1,8);//第二行第二个字输出R
	}

	/* calculate buffer index */
	tmphead=(UART0_RxHead+1)&RxBuf_Mask;
	UART0_RxHead=tmphead; /* store new index */
	if (tmphead==UART0_RxTail)
	{
	   /* ERROR! Receive buffer overflow */
	   display_word(10,0,0,8);
	   display_word(14,8,0,8);
	   display_word(14,16,0,8);
	   display_word(15,24,0,8);
	   display_word(14,32,0,8);
	}
	UART0_RxBuf[tmphead]=data; /* store received data in buffer */
	
}
//USART0 DATA Register Empty interrupt
/******************************/
SIGNAL(SIG_USART0_DATA)
{
	uchar tmptail;
	//判断是不是所有的数据都发送完了
	if(UART0_TxTail!=UART0_TxHead)
	{
		tmptail=(UART0_TxTail+1)&TxBuf_Mask;
		UART0_TxTail=tmptail;
		UDR0=UART0_TxBuf[tmptail];
	}
	else
	{
		//disable UDRE interrput
		UCSR0B&=~(1<<UDRIE0);
	}
}
/*发送数据函数*/
void UART0_TransmitByte(uchar data)
{
	uchar tmphead;
	tmphead=(UART0_TxHead+1)&TxBuf_Mask;//求发送数据的头地址
	//等待空地址
	while(tmphead==UART0_TxTail);
	UART0_TxBuf[tmphead]=data;
	UART0_TxHead=tmphead;
	UCSR0B|=(1<<UDRIE0);					//开数据寄存器空中断
}
/*接收缓存器读取数据函数*/
/*
unsigned char UART0_ReceiveByte( void )
{
	unsigned char tmptail;
	//等待接收数据
	while(UART0_RxHead==UART0_RxTail );
	tmptail=( UART0_RxTail+1)&RxBuf_Mask;
	UART0_RxTail = tmptail; // store new index 
	return UART0_RxBuf[tmptail]; // return data 
}
*/

/*
unsigned char UART0_ReceiveUnEmpty(void)
{
	return(UART0_RxHead!=UART0_RxTail);
	//如果接收缓存器不为空返回1
}
*/

void init_RxBuff(void)
{
   UART0_RxTail=0;
   UART0_RxHead=0;
}

void get_gps(uchar *p)
{
  //cli();			//禁止中断
  uchar tmptail,i;
  uchar *buf_point;
  buf_point=p;
  tmptail=(UART0_RxTail+1)&RxBuf_Mask;
  if(tmptail==UART0_RxHead)	//判断头指针是否等于尾指针
  	goto EXIT0;
  else if(UART0_RxBuf[tmptail]!='$') //判断是不是NEMA协议数据
	goto EXIT0;
  else
	{
	   //判断数据是不是GLL协议,不是退出
	   //display_word(15,16,1,8);//第二行第三个字输出O
	   UART0_RxTail=tmptail;
	   tmptail=(UART0_RxTail+1)&RxBuf_Mask;
	   if(UART0_RxBuf[tmptail]!='G'||UART0_RxTail==UART0_RxHead)
	   {
			goto EXIT0;
	   };
	   UART0_RxTail=tmptail;
	   tmptail=(UART0_RxTail+1)&RxBuf_Mask;
	   if(UART0_RxBuf[tmptail]!='P'||UART0_RxTail==UART0_RxHead)
	   {
			goto EXIT0;
	   };
	   UART0_RxTail=tmptail;
	   tmptail=(UART0_RxTail+1)&RxBuf_Mask;
	   if(UART0_RxBuf[tmptail]!='G'||UART0_RxTail==UART0_RxHead)
	   {
			goto EXIT0;
	   };
	   UART0_RxTail=tmptail;
	   tmptail=(UART0_RxTail+1)&RxBuf_Mask;
	   if(UART0_RxBuf[tmptail]!='L'||UART0_RxTail==UART0_RxHead)
	   {
			goto EXIT0;
	   };
       UART0_RxTail=tmptail;
	   tmptail=(UART0_RxTail+1)&RxBuf_Mask;
	   if(UART0_RxBuf[tmptail]!='L'||UART0_RxTail==UART0_RxHead)
	   {
			goto EXIT0;
	   };
	   //默认完全接收到GPS信号,不再判断头尾指针是否重合
	   //display_word(10,0,1,8);//第二行第一个字输出E
	   UART0_RxTail=tmptail;
	   UART0_RxTail++;			//抛掉‘,’
		for(i=0;i<9;i++)
	  	{
			UART0_RxTail++;
			(*buf_point++)=UART0_RxBuf[UART0_RxTail];
		}
		(*buf_point++)=',';
		UART0_RxTail+=3;		//抛掉',',和其他无用信息
		for(i=0;i<10;i++)
	  	{
			UART0_RxTail++;
			(*buf_point++)=UART0_RxBuf[UART0_RxTail];
		}
		(*buf_point++)=',';
		UART0_RxTail+=3;		//抛掉',',和其他无用信息
		for(i=0;i<10;i++)
	  	{
			UART0_RxTail++;
			(*buf_point++)=UART0_RxBuf[UART0_RxTail];
		}
		UART0_RxTail+=2;
		//UART0_RxTail++;
		/*
		if(UART0_RxBuf[UART0_RxTail]!='A')
		{
			while(p<=buf_point)
				*p=0;			//接收数据无效,清除显示缓冲区
			goto EXIT0;
		}
		UART0_RxTail++;
		UART0_RxTail++;
		*/
		(*buf_point++)=UART0_RxBuf[UART0_RxTail];	//工作模式
		UART0_RxTail+=2;
		(*buf_point++)=UART0_RxBuf[UART0_RxTail];	
	}
EXIT0:init_RxBuff();
	//sei();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -