📄 gps.c
字号:
#include <msp430x14x.h>
#include <stdlib.h>
#include <in430.h>
void init_usart0(void);
void init_usart1(void);
void save(void);
void store(char *source,char *dest);
void flash_clr(char *Data_ptr);
void replace(char *c,char *d);
void seg_flash(char *source_ptr,char *des_ptr);
char id[3]={'1','0','0'};
char flag=0;
char j=0;
char valid=0; //是否为每隔5分钟的有效数据?
char send=0; //是否有要向gprs设备发送的数据?
char gps_init=0;
char data[52];
char new_data[55]={'$',','};
char speed[5];
char buffer[512];
char position[22];
float speed1,speed2;
int speed3;
char data_in_flash=0;
char *flash_init;
char *flash_ptr;
char *seg_ptr;
char inf_number=0;
char frame_from_gps[7]={'$','G','P','R','M','C',','};
char data1[6];
char change=1;
unsigned long time_now=0;
unsigned long time_past=0;
void init_usart0(void)
{
UCTL0&=~SWRST;
UCTL0=0x10;
UTCTL0=SSEL0; //选择Aclk为时钟
UBR00=0x03; //选择波特率9600,所以分频因子104.166。。。
UBR10=0x00;
UMCTL0=0x4a;
ME1=UTXE0+URXE0; //允许发送和接收
P3SEL=BIT4+BIT5;
P3DIR|=BIT4;
P3DIR&=~BIT5;
IE1|=URXIE0; //允许接收中断
}
void init_usart1(void)
{
UCTL1&=~SWRST;
UCTL1=0x10;
UTCTL1=SSEL0; //选择Aclk为时钟
UBR01=0x03; //选择波特率9600,所以分频因子104.166。。。
UBR11=0x00;
UMCTL1=0x4a;
ME1=UTXE1+URXE1; //允许发送和接收
P3SEL|=BIT6+BIT7;
P3DIR|=BIT7;
P3DIR&=~BIT6;
}
interrupt[UART0RX_VECTOR] void UART0RX(void) //flag=7表示接收到帧头
{
char i;
switch(flag)
{case 0x00:
{if(RXBUF0==frame_from_gps[flag])
flag++;
break;
}
case 0x01:
{if(RXBUF0==frame_from_gps[flag])
flag++;
break;
}
case 0x02:
{if(RXBUF0==frame_from_gps[flag])
flag++;
break;
}
case 0x03:
{if(RXBUF0==frame_from_gps[flag])
flag++;
break;
}
case 0x04:
{if(RXBUF0==frame_from_gps[flag])
flag++;
break;
}
case 0x05:
{if(RXBUF0==frame_from_gps[flag])
flag++;
break;
}
case 0x06:
{if(RXBUF0==frame_from_gps[flag])
flag++;
break;
}
case 0x07:
{
data[j]=RXBUF0;
j++;
if(j==52) //每秒的GPS有效数据接收完毕
{
j=0;
flag=0;
for(i=0;i<6;i++)
data1[i]=data[i]-0x30; //存放时间量
if(gps_init==0) //是第一次的数据,保存
{
time_past=(((unsigned int)data1[0]*10+(unsigned int)data1[1])*3600+((unsigned int)data1[2]*10+(unsigned int)data1[3])*60+((unsigned int)data1[4]*10+(unsigned int)data1[5])); //单位秒
for(i=0;i<22;i++) //存放初次的位置信息
position[i]=data[i+9];
gps_init=1;
valid=1;
}
if(gps_init==1)
{
time_now=(((unsigned int)data1[0]*10+(unsigned int)data1[1])*3600+((unsigned int)data1[2]*10+(unsigned int)data1[3])*60+((unsigned int)data1[4]*10+(unsigned int)data1[5])); //单位秒
if(time_now-time_past==300) //判断是否到了每隔5分钟
{
time_past=time_now;
for(i=0;i<22;i++) //判断位置有无变化
{
if(data[i+9]!=position[i]) //有变化,置标志位
{
change=1;
break;
}
else
change=0;
}
for(i=0;i<22;i++)
position[i]=data[i+9]; //更新position数据
valid=1;
}
}
while(valid==1) //无效数据,等待
//有效数据,重组
//id
{for(i=0;i<3;i++)
new_data[i+2]=id[i];
new_data[5]=',';
//a/v
new_data[6]=data[7];
new_data[7]=',';
//日期yy
for(i=0;i<2;i++)
new_data[i+8]=data[i+50];
//mm
for(i=0;i<2;i++)
new_data[i+10]=data[i+48];
//dd
for(i=0;i<2;i++)
new_data[i+12]=data[i+46];
//时间
for(i=0;i<6;i++)
new_data[i+14]=data[i];
new_data[20]=',';
//纬度
for(i=0;i<2;i++)
new_data[i+21]=data[i+9];
new_data[23]='.';
for(i=0;i<2;i++)
new_data[i+24]=data[i+11];
for(i=0;i<2;i++)
new_data[i+26]=data[i+14];
for(i=0;i<9;i++)
new_data[28]=',';
//n/s
new_data[29]=data[19];
new_data[30]=',';
//经度
for(i=0;i<3;i++)
new_data[i+31]=data[i+21];
new_data[34]='.';
for(i=0;i<2;i++)
new_data[i+35]=data[i+24];
for(i=0;i<2;i++)
new_data[i+37]=data[i+27];
new_data[39]=',';
//速率
for(i=0;i<3;i++)
data[i+34]=data[i+34]-0x30;
data[38]=data[38]-0x30;
speed1=((float)data[34]*100+(float)data[35]*10+(float)data[36]+(float)data[38]*0.1); //speed1为十进制单位为节的速率值
speed2=speed1/1.852; //speed2为十进制单位为公里的速率值
speed3=(int)speed2;
speed[0]=(char)(speed3/100);
speed[1]=(char)((speed3-speed[0]*100)/10);
speed[2]=(char)(speed3-speed[0]*100-speed[1]*10);
speed[3]='.'-0x30;
speed[4]=(char)((int)((speed2-speed3)/0.1));
for(i=0;i<5;i++)
new_data[i+40]=speed[i]+0x30;
new_data[45]=',';
//航向
for(i=0;i<5;i++)
new_data[i+46]=data[i+40];
new_data[51]=',';
new_data[52]='*';
new_data[53]=0x0d; //CR
new_data[54]=0x0a; //LF
send=1;
valid=0; //重新开始下一次数据
} //while
} //j=52
} //case07
} //switch
}
void save(void)
{
flash_init=(char *)0x3000;
flash_ptr=flash_init+inf_number*64; //flash_ptr为待写入数据的地址,存完数据后的地址为flash_ptr+64
seg_ptr=flash_init+(inf_number/8)*512; //计算段首址
store(seg_ptr,buffer);
flash_clr(seg_ptr);
replace(buffer,new_data); //至此,buffer中的内容为包含新用户的整段
seg_flash(buffer,seg_ptr);
inf_number++;
data_in_flash=1;
_EINT();
}
void store(char *source,char *dest) //保存要修改的整段
{int i;
for(i=0;i<512;i++)
*dest++=*source++;
}
void flash_clr(char *Data_ptr)
{
FCTL1 = 0x0A502; /* ERASE = 1 */
FCTL3 = 0x0A500; /* Lock = 0 */
*Data_ptr=0; /* erase Flash segment */
}
void replace(char *c,char *d) //c为buffer,d为new_data
{
int i;
char *ptr;
ptr=c+64*(inf_number%4);
for(i=0;i<64;i++)
{*ptr=(*d);
ptr++;
d++;
}
}
void seg_flash(char *source_ptr,char *des_ptr)
{
int i;
IFG1=0; //清除中断
_DINT();
FCTL3=0x0a500;
FCTL1=0x0a540;
for(i=0;i<512;i++) //写
*des_ptr++=*source_ptr++;
}
void main (void)
{
int i;
char *n;
n=flash_init;
WDTCTL=WDTPW+WDTHOLD; // 关闭WDT
BCSCTL2=0xbe; //选择XT2CLK8分频作为SMCLk和MCLK*/
P1OUT=BIT0+BIT3; //置为无效状态
P1DIR=BIT0+BIT3; //BIT0-DTR;BIT1-DSR;BIT2-CTS;BIT3-RTS;BIT4-DCD
P1SEL=0x00;
init_usart0();
//init_usart1();
_EINT();
while(1) //死循环
{while(send==0); //查看有无待发送数据
if(P1IN&0x10==0) //有数据,检测gprs状态,dcd有效
{P1OUT&=~BIT3; //RTS有效
if(P1IN&0x04==0) //检测CTS,有效
{
switch(data_in_flash) //检测flash中是否有数据
{
case 1: //有则首先发送flash中数据
{
for(i=0;i<inf_number*64;i++)
{
TXBUF0=*flash_init++;
while((UTCTL0&0x01)==0);
}
for(n=flash_init;n<flash_ptr+64;n=n+512)
flash_clr(n); //清空flash中的数据
data_in_flash=0; //清除标志位
break;
}
case 0:
{for(i=0;i<53;i++) //没有则发送现在的数据
{
TXBUF0=new_data[i];
while((UTCTL0&0x01)==0);
}
} //case 0
} //switch
}
else //CTS无效
if(change==1)
{save();
send=0; //清除有数据发送标志
}
}
else //DCD无效
if(change==1)
{save();
send=0; //清除有数据发送标志位
}
} //死循环
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -