📄 uart.c
字号:
#include "common.h"
#include "uart.h"
// 串口数据定义
//unsigned char UART_Buffer[UART_BUFFERSIZE];
unsigned char UART_Buffer_Size = 0;
unsigned char UART_Input_First = 0;
static unsigned char tmp;
// GPS数据接收定义
extern unsigned char JD[10]; //经度
extern unsigned char JD_a; //经度方向
extern unsigned char WD[9]; //纬度
extern unsigned char WD_a; //纬度方向
extern unsigned char time[6]; //时间
extern unsigned char date[6]; //日期
extern unsigned char speed[5]; //速度
extern unsigned char Height[6]; //高度
extern unsigned char angle[5]; //方位角
extern unsigned char use_sat[2]; //使用的卫星数
extern unsigned char total_sat[2]; //天空中总卫星数
//串口中断需要的变量
extern unsigned char seg_count; //逗号计数器
extern unsigned char dot_count; //小数点计数器
extern unsigned char byte_count; //位数计数器
extern unsigned char cmd_number; //命令类型
extern unsigned char mode; //0:结束模式,1:命令模式,2:数据模式
extern unsigned char buf_full; //1:整句接收完成,相应数
extern unsigned char cmd[5]; //命令类型存储数组
//显示需要的变量
extern unsigned char dsp_count; //刷新次数计数器
extern unsigned char time_count;
extern unsigned char Height_num,a_num,s_num;
void UART0_Init (void)
{
char SFRPAGE_SAVE;
SFRPAGE_SAVE = SFRPAGE; // Preserve SFRPAGE
SFRPAGE = TMR2_PAGE;
TMR2CN = 0x00; // Timer in 16-bit auto-reload up timer
// mode
TMR2CF = 0x08; // SYSCLK is time base; no output;
// up count only
RCAP2 = - ((long) SYSTEMCLOCK/BAUDRATE/16);
TMR2 = RCAP2;
TR2= 1; // Start Timer2
SFRPAGE = UART0_PAGE;
SCON0 = 0x50; // 8-bit variable baud rate;
// 9th bit ignored; RX enabled
// clear all flags
SSTA0 = 0x15; // Clear all flags; enable baud rate
// doubler (not relevant for these
// timers);
// Use Timer2 as RX and TX baud rate
// source;
ES0 = 1;
IP |= 0x10;
SFRPAGE = SFRPAGE_SAVE; // Restore SFRPAGE
}
void UART0_Interrupt (void) interrupt 4
{
SFRPAGE = UART0_PAGE;
if (RI0 == 1)
{
if( UART_Buffer_Size == 0) { // If new word is entered
UART_Input_First = 0; }
RI0 = 0; // Clear interrupt flag
tmp=SBUF0; //将接收数据暂时保存
switch(tmp){
case '$':
cmd_number=0; //命令类型清空
mode=1; //接收命令模式
byte_count=0; //接收位数清空
break;
case ',':
seg_count++; //逗号计数加1
byte_count=0;
break;
case '*':
switch(cmd_number){
case 1:
buf_full|=0x01;
break;
case 2:
buf_full|=0x02;
break;
case 3:
buf_full|=0x04;
break;
case 4:
buf_full|=0x08;
break;
}
mode=0;
break;
default:
if(mode==1){
//命令种类判断
cmd[byte_count]=tmp; //接收字符放入类型缓存
if(byte_count>=4){ //如果类型数据接收完毕,判断类型
if(cmd[0]=='G'){
if(cmd[1]=='P'){
if(cmd[2]=='G'){
if(cmd[3]=='G'){
if(cmd[4]=='A'){
cmd_number=1;
mode=2;
seg_count=0;
byte_count=0;
Height_num=0;
}
}
else if(cmd[3]=='S'){
if(cmd[4]=='V'){
cmd_number=2;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
else if(cmd[2]=='R'){
if(cmd[3]=='M'){
if(cmd[4]=='C'){
cmd_number=3;
mode=2;
seg_count=0;
byte_count=0;
a_num=0;
s_num=0;
}
}
}
else if(cmd[2]=='Z'){
if(cmd[3]=='D'){
if(cmd[4]=='A'){
cmd_number=4;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
}
}
}
}
else if(mode==2){
//接收数据处理
switch (cmd_number){
case 1: //类型1数据接收。GPGGA
switch(seg_count){
case 2: //纬度处理
if(byte_count<9){
WD[byte_count]=tmp;
}
break;
case 3: //纬度方向处理
if(byte_count<1){
WD_a=tmp;
}
break;
case 4: //经度处理
if(byte_count<10){
JD[byte_count]=tmp;
}
break;
case 5: //经度方向处理
if(byte_count<1){
JD_a=tmp;
}
break;
case 7: //定位使用的卫星数
if(byte_count<2){
use_sat[byte_count]=tmp;
}
break;
case 9: //高度处理
if(byte_count<6){
Height[byte_count]=tmp;
Height_num++;
}
break;
}
break;
case 2: //类型2数据接收。GPGSV
switch(seg_count){
case 3: //天空中的卫星总数
if(byte_count<2){
total_sat[byte_count]=tmp;
}
break;
}
break;
case 3: //类型3数据接收。GPRMC
switch(seg_count){
case 7: //速度处理
if(byte_count<5){
speed[byte_count]=tmp;
s_num++;
}
break;
case 8: //方位角处理
if(byte_count<5){
angle[byte_count]=tmp;
a_num++;
}
break;
}
break;
case 4: //类型4数据接收。GPZDA
switch(seg_count){
case 1:
if(byte_count<6){ //时间处理
time[byte_count]=tmp;
}
break;
case 2:
if(byte_count<2){
date[byte_count]=tmp;
}
break;
case 3:
if(byte_count<2){
date[byte_count+2]=tmp;
}
break;
case 4:
if((byte_count<4)&&(byte_count>1)){
date[byte_count+2]=tmp;
}
break;
}
break;
}
}
byte_count++; //接收数位加1
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -