📄 uart.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 + -