基于DSP的GPGGA定位数据提取源程序(代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

温泉源:基于DSP的GPGGA定位数据提取
基于DSP的GPGGA定位数据提取源程
序(完整)
附录源程序
#include <stdio.h>
#include "mmdrv.h"
#include "mcbsp.h" //串口头文件
#include "cpu_reg.h"
#include "lcd_86.h"
#define uint16 unsigned int
#define uint8 unsigned char
ioport unsigned portefff;
#define IO_374 portefff
void init_exint1_interrupt();
void init_GPIO(void);
void uart_rece_data_parse(void);//数据解析函数
void uart_trans(void);
void uart_trans_byte(unsigned int data);
unsigned int flag=0xffff;
char tx_re_buf[1]={0x38};
/*************************************************/
/* welcome interface */
/*************************************************/
void display()
{
LCD_clear(0);
cur_row=0;
cur_col=50;
LCD_pr_chars(" Parse GPGGA data",20);
cur_row=1;
cur_col=0;
LCD_pr_chars("*********************",22);
cur_row=2;
cur_col=0;
LCD_pr_chars("Press key1:tm,lat,lon,hght",26);
cur_row=3;
cur_col=0;
LCD_pr_chars("Press key2:for more data",25);
cur_row=4;
cur_col=11;
LCD_pr_chars("please work harder",25);
}
void main(void)
{
unsigned int key_val;
unsigned int i,j;
SWWSR = 0x7fff;
SWCR = 0x0001;
BSCR = 0x8006;
CLKMD = PLL_DIV_INIT;
waitloop( 0x0400 );
CLKMD = PLL_LOCK_INIT_X(14);
waitloop( 0x0400 );
PMST = 0x0168;
IO_374=0xffff; //374 enable
init_exint1_interrupt();
init_GPIO();
init_lcd();
display(); //显示菜单
Close_LED_sign();
Close_LED_Data();
Close_LED_Traf();
waitloop( 0x0400 );
while(1)
{
flag=0xffff; /*消抖*/
i=Get_Key();
waitloop( 0x040000L );
j=Get_Key();
if(i==j)
{
key_val=j; /*保存key_val*/
while(Get_Key())
{
asm("\tnop"); //wait blank_key
}
}
switch(key_val)
{
default:
break;
case 1:
LCD_clear(0); //清屏
uart_rece_data_parse(); //提取海拔,时间,纬度,经度
break;
case 17:
display();
break;
}
}
}
/*************************************************/ /* initial interrrupt */
/*************************************************/ void init_exint1_interrupt()
{
IFR =0xffff;
IMR =0x0002; //TINT=IMR.3 EXINT1=IMR.1 asm("\trsbx\tintm ");
}
interrupt void EXINT1_isr()
{
Close_LED_sign();
Close_LED_Data();
Close_LED_Traf();
{
asm("\tnop"); //中断处理函数
asm("\tnop");
}
flag=0;
cur_row=7;
cur_col=15;
LCD_pr_chars(" Uart_Stop ",17);
}
/*************************************************/ /* initial GPIO */ /*************************************************/
void init_GPIO(void)
{
GPIOCR =0xfffe; //EXINT1=GPIO.0=input=0,nand_cs=GPIO.6=output=1
GPIOSR =0x0040; //GPIO.6=output=1
}
/*************************************************/
/* pare GPGGA data */
/*************************************************/
void uart_rece_data_parse(void)
{
unsigned int ii;
unsigned int jj;
unsigned char data[300];
unsigned int tm[7],latitude[10],lontitude[11],height[8],EW[2],NS[2];
unsigned int locate=0;
unsigned int comma=0;
unsigned int data_num=0;
char chartable[10]={'0','1','2','3','4','5','6','7','8','9'};
Uart_Init();
for(ii=0;ii<300;ii++)//清空数据缓冲区
{
data[ii] =0;
}
while(1)
{
do
{
jj = Uart_rx();
if(!flag)
{
asm("\tnop");
break;
}
}while(jj==0xFFFF);
if(locate<300)//存储接收到的数据
{
data[locate] =jj;
locate++;
}
else
{
ii=0;
while(1)
{
if(data[ii]==36) //$
{
if((ii+1)<300&&data[ii+1]==71)//G
if((ii+2)<300&&data[ii+2]==80)//P
if((ii+3)<300&&data[ii+3]==71)//G
if((ii+4)<300&&data[ii+4]==71)//G
if((ii+5)<300&&data[ii+5]==65)//A
break; //判断是否为GPGGA数据}
ii++;
}
ii+=6;
for(;ii<300;ii++)
{
if(data[ii]==36)
break; //$
if(comma==1)//获取时间
{
tm[data_num]=data[ii];
data_num++;
}
else if(comma==2)//获取纬度
{
latitude[data_num]=data[ii];
data_num++;
}
else if(comma==3)//获取南北纬标志位
{
NS[data_num]=data[ii];
data_num++;
}
else if(comma==4)//获取经度
{
lontitude[data_num]=data[ii];
data_num++;
}
else if(comma==5)//获取东西经标志位
{
EW[data_num]=data[ii];
data_num++;
}
else if(comma==9)
{
height[data_num]=data[ii];
data_num++;
}
if(data[ii]==44)//判断是否为逗号
{
comma++;
data_num=0;//从逗号后第一个字节开始存储数据}
}
//LCD显示提取信息
cur_col=50;
cur_row=0;
LCD_pr_chars("GPGGA",5);
cur_col=0;
cur_row=1;
LCD_pr_chars("***********************",23); cur_col = 1;
cur_row =2;
LCD_pr_chars("Time:",5);
LCD_nextchar(chartable[tm[0]-48]);
LCD_nextchar(chartable[tm[1]-48]);
LCD_nextchar(':');
LCD_nextchar(chartable[tm[2]-48]);
LCD_nextchar(chartable[tm[3]-48]);
LCD_nextchar(':');
LCD_nextchar(chartable[tm[4]-48]);
LCD_nextchar(chartable[tm[5]-48]);
cur_col = 1;
cur_row = 3;
LCD_pr_chars("Latitude:",9);
for(ii=0;ii<9;ii++)
{
if(latitude[ii]==46)
LCD_nextchar('.');
else
LCD_nextchar(chartable[latitude[ii]-48]); }
if(NS[0]==78)
LCD_nextchar('N');
else
LCD_nextchar('S');
cur_col = 1;
cur_row = 4;
LCD_pr_chars("Longitude:",10);
for(ii=0;ii<9;ii++)
{
if(lontitude[ii]==46)
LCD_nextchar('.');
else
LCD_nextchar(chartable[lontitude[ii]-48]); }
if(EW[0]==69)
LCD_nextchar('E');
else
LCD_nextchar('W');
cur_col = 1;
cur_row = 5;
LCD_pr_chars("height:",7);
for(ii=0;ii<4;ii++)
{
if(height[ii]==46)
LCD_nextchar('.');
else
LCD_nextchar(chartable[height[ii]-48]); }
cur_row=7;
cur_col=0;
LCD_pr_chars("Press <Esc> to Exit",19);
break;
}
}
return;
}。

相关文档
最新文档