//串口接收程序
void sbuff_receive() interrupt 4 using 2
{
uchar pp;
light=1;
ri=0;
pp=sbuf;
switch(pp){
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;
case 5:
buf_full|=0x16;
break;
case 6:
buf_full|=0x32;
break;
}
mode=0;
break;
default:
if(mode==1){
//命令种类判断
cmd[byte_count]=pp; //接收字符放入类型缓存
if(byte_count>=4){ //如果类型数据接收完毕,判断类型
if(cmd[0]=='g'){
if(cmd[1]=='p'){
if(cmd[2]=='v'){
if(cmd[3]=='t'){
if(cmd[4]=='g'){
cmd_number=6;
mode=2;
seg_count=0;
}
}
}
if(cmd[2]=='g'){
if(cmd[3]=='g'){
if(cmd[4]=='a'){
cmd_number=1;
mode=2;
seg_count=0;
byte_count=0;
high_num=0;
}
}
else if(cmd[3]=='s'){
if(cmd[4]=='v'){
cmd_number=2;
mode=2;
seg_count=0;
byte_count=0;
}
if(cmd[4]=='a'){
cmd_number=5;
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]=pp;
}
break;
case 3: //纬度方向处理
if(byte_count<1){
wd_a=pp;
}
break;
case 4: //经度处理
if(byte_count<10){
jd[byte_count]=pp;
}
break;
case 5: //经度方向处理
if(byte_count<1){
jd_a=pp;
}
break;
case 7: //定位使用的卫星数
if(byte_count<2){
use_sat[byte_count]=pp;
}
break;
case 9: //高度处理
if(byte_count<6){
high[byte_count]=pp;
high_num++;
}
break;
}
break;
case 2: //类型2数据接收。gpgsv
switch(seg_count){
case 3: //天空中的卫星总数
if(byte_count<2){
total_sat[byte_count]=pp;
}
break;
}
break;
case 3: //类型3数据接收。gprmc
switch(seg_count){
case 2 : //定位标志
if(byte_count<1){
dw[byte_count]=pp;
}
break;
case 7: //速度处理,单位节,1节=1852m/h
if(byte_count<5){
speed[byte_count]=pp;
s_num++;
}
break;
case 8: //方位角处理
if(byte_count<5){
angle[byte_count]=pp;
//a_num++;
}
break;
}
break;
case 4: //类型4数据接收。gpzda
switch(seg_count){
case 1:
if(byte_count<2){ //时间处理
time_s[byte_count]=pp;
break;
}
if(byte_count<4){ //时间处理
time_s[byte_count]=pp;
break;
}
if(byte_count<6){ //时间处理
time_s[byte_count]=pp;
}
break;
case 2:
if(byte_count<2){
date_d[byte_count]=pp;
}
break;
case 3:
if(byte_count<2){
date_m[byte_count]=pp;
}
break;
case 4:
if(byte_count<4){
date_y[byte_count]=pp;
}
break;
}
break;
case 5: //类型数据接收。gpgsa
switch(seg_count){
case 2:
if(byte_count<1){ //二维三维定位标志处理
dd[byte_count]=pp;
}
break;
}
break;
case 6: //类型数据接收。gpvtg
switch(seg_count){
case 7:
if(byte_count<5){ //速度,单位km/h
speed_km[byte_count]=pp;
}
break;
}
break;
}
}
byte_count++; //接收数位加1
break;
}
}