📄 gps.c.bak
字号:
else
{
}
receive_buffer_count = 0;
GPRMC.CR_LF[0] = CR;
GPRMC.CR_LF[1] = LF;
receive_flag = RMC_OTHER;
GPS_RECEIVE_DONE_FLAG = 1;
}
break;
default:
//receive_buffer_count = 0;
break;
}
}
void __irq_code GGA_receive(void)
{
switch(receive_flag)
{
case GGA_TIME: // Receive UTC time character.
GPS_data_buf = (char *)(&GPGGA.UTC_timer);
data_length = 10;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_LATITUDE;
group_receive_done_flag = 0;
}
break;
case GGA_LATITUDE:
GPS_data_buf = (char *)(&GPGGA.latitude);
data_length = 10;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_LATITUDE_ASPECT;
group_receive_done_flag = 0;
}
break;
case GGA_LATITUDE_ASPECT:
GPS_data_buf = (char *)(&GPGGA.latitude_aspect);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_LONGITUDE;
group_receive_done_flag = 0;
}
break;
case GGA_LONGITUDE:
GPS_data_buf = (char *)(&GPGGA.longitude);
data_length = 11;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_LONGITUDE_ASPECT;
group_receive_done_flag = 0;
}
break;
case GGA_LONGITUDE_ASPECT:
GPS_data_buf = (char *)(&GPGGA.longitude_aspect);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_QUALITY;
group_receive_done_flag = 0;
}
break;
case GGA_QUALITY:
GPS_data_buf = (char *)(&GPGGA.quality);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_STAR_SUM;
group_receive_done_flag = 0;
}
break;
case GGA_STAR_SUM:
GPS_data_buf = (char *)(&GPGGA.star_sum);
data_length = 3;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_LEVEL_PRECISION;
group_receive_done_flag = 0;
}
break;
case GGA_LEVEL_PRECISION:
GPS_data_buf = (char *)(&GPGGA.level_precision);
data_length = 5;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_ANTENNA_HEIGHT;
group_receive_done_flag = 0;
}
break;
case GGA_ANTENNA_HEIGHT:
GPS_data_buf = (char *)(&GPGGA.antenna_height);
data_length = 9;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_AH_UNIT;
group_receive_done_flag = 0;
}
break;
case GGA_AH_UNIT:
GPS_data_buf = (char *)(&GPGGA.AH_unit);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_EARTH_HEIGHT;
group_receive_done_flag = 0;
}
break;
case GGA_EARTH_HEIGHT:
GPS_data_buf = (char *)(&GPGGA.earth_height);
data_length = 7;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_EH_UNIT;
group_receive_done_flag = 0;
}
break;
case GGA_EH_UNIT:
GPS_data_buf = (char *)(&GPGGA.EH_unit);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GGA_UN_USE1;
group_receive_done_flag = 0;
}
break;
case GGA_UN_USE1:
if(c != '*')
{
GPGGA.un_use1[receive_buffer_count] = c;
if((++receive_buffer_count) > (5 - 1))
{
receive_buffer_count--;
}
}
else
{
GPGGA.end_flag = '*';
c2 = checksum & 0x0f; c1 = ((checksum >> 4) & 0x0f); // Change checksum to ASCII.
if (c1 < 10) c1+= '0'; else c1 += 'A' - 10;
if (c2 < 10) c2+= '0'; else c2 += 'A' - 10;
while(receive_buffer_count < (5 - 1))
{
receive_buffer_count ++;
GPGGA.un_use1[receive_buffer_count] = ' ';
}
receive_flag = GGA_CHECKSUM;
receive_buffer_count = 0;
group_receive_done_flag = 0;
}
break;
case GGA_CHECKSUM: // Receive UTC date character.
GPGGA.checksum[receive_buffer_count] = c;
if(receive_buffer_count++ >= 1)
{
if((c1 == GPGGA.checksum[0]) && (c2 == GPGGA.checksum[1]))
{
}
else
{
}
receive_buffer_count = 0;
GPGGA.CR_LF[0] = CR;
GPGGA.CR_LF[1] = LF;
receive_flag = GGA_OTHER;
}
break;
default:
break;
}
}
void __irq_code GSA_receive(void)
{
switch(receive_flag)
{
case GSA_MODE: // Receive UTC time character.
GPS_data_buf = (char *)(&GPGSA.wrok_mode);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GSA_STATE;
group_receive_done_flag = 0;
}
break;
case GSA_STATE:
GPS_data_buf = (char *)(&GPGSA.position_MSG);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GSA_UN_USE;
group_receive_done_flag = 0;
}
break;
case GSA_UN_USE:
if(c != '*')
{
GPGSA.un_use[receive_buffer_count] = c;
if((++receive_buffer_count) > (GSA_UN_USE_LENGTH - 1))
{
receive_buffer_count--;
}
}
else
{
GPGSA.end_flag = '*';
c2 = checksum & 0x0f; c1 = ((checksum >> 4) & 0x0f); // Change checksum to ASCII.
if (c1 < 10) c1+= '0'; else c1 += 'A' - 10;
if (c2 < 10) c2+= '0'; else c2 += 'A' - 10;
while(receive_buffer_count < (GSA_UN_USE_LENGTH - 1))
{
receive_buffer_count ++;
GPGSA.un_use[receive_buffer_count] = ' ';
}
receive_flag = GSA_CHECKSUM;
receive_buffer_count = 0;
}
break;
case GSA_CHECKSUM: // Receive UTC date character.
GPGSA.checksum[receive_buffer_count] = c;
receive_buffer_count++;
if(receive_buffer_count > 2)
{
if((c1 == GPGSA.checksum[0]) && (c2 == GPGSA.checksum[1]))
{
}
else
{
}
receive_buffer_count = 0;
GPGSA.CR_LF[0] = CR;
GPGSA.CR_LF[1] = LF;
receive_flag = GSA_OTHER;
}
break;
default:
break;
}
}
void __irq_code GSV_receive(void)
{
switch(receive_flag)
{
case GSV_SUM: // Receive UTC time character.
GPS_data_buf = (char *)(&_GSV_sum_);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
receive_flag = GSV_ITEM;
group_receive_done_flag = 0;
}
break;
case GSV_ITEM:
GPS_data_buf = (char *)(&_GSV_item_);
data_length = 2;
GPS_one_group_receive();
if(group_receive_done_flag)
{
switch(_GSV_item_[0])
{
case '1':
GSV_pointer = &GPGSV1;
break;
case '2':
GSV_pointer = &GPGSV2;
break;
case '3':
GSV_pointer = &GPGSV3;
break;
case '4':
GSV_pointer = &GPGSV4;
break;
default:
//GSV_pointer = 0;
break;
}
GSV_pointer->GSV_sum[0] = _GSV_sum_[0];
GSV_pointer->GSV_sum[1] = _GSV_sum_[1];
GSV_pointer->GSV_item[0] = _GSV_item_[0];
GSV_pointer->GSV_item[1] = _GSV_item_[1];
receive_flag = GSV_UN_USE;
group_receive_done_flag = 0;
}
break;
case GSV_UN_USE:
if(c != '*')
{
GSV_pointer->un_use[receive_buffer_count] = c;
receive_buffer_count++;
if(receive_buffer_count > (GSV_UN_USE_LENGTH - 1))
{
receive_buffer_count--;
}
}
else
{
GSV_pointer->end_flag = '*';
c2 = checksum & 0x0f; c1 = ((checksum >> 4) & 0x0f); // Change checksum to ASCII.
if (c1 < 10) c1+= '0'; else c1 += 'A' - 10;
if (c2 < 10) c2+= '0'; else c2 += 'A' - 10;
while(receive_buffer_count < (GSV_UN_USE_LENGTH - 1))
{
receive_buffer_count ++;
GSV_pointer->un_use[receive_buffer_count] = ' ';
}
receive_flag = GSV_CHECKSUM;
receive_buffer_count = 0;
}
break;
case GSV_CHECKSUM: // Receive UTC date character.
GSV_pointer->checksum[receive_buffer_count] = c;
if(receive_buffer_count++ >= 1)
{
if((c1 == GSV_pointer->checksum[0]) && (c2 == GSV_pointer->checksum[1]))
{
}
else
{
}
receive_buffer_count = 0;
receive_flag = GSV_OTHER;
GSV_pointer->CR_LF[0] = CR;
GSV_pointer->CR_LF[1] = LF;
}
break;
default: break;
}
}
void __irq_code GPS_one_group_receive(void)
{
if(c != ',')
{
*(GPS_data_buf + (receive_buffer_count++)) = c;
if(receive_buffer_count > (data_length - 1))
{
receive_buffer_count--;
}
}
else
{
GPS_data_buf[receive_buffer_count] = ',';
while(receive_buffer_count < (data_length - 1))
{
receive_buffer_count ++;
GPS_data_buf[receive_buffer_count] = ' ';
}
group_receive_done_flag = 1;
receive_buffer_count = 0;
}
}
void __irq_code GPS_STR_head_receive(void)
{
if(c != ',')
{
string_head_buf[receive_buffer_count] = c;
receive_buffer_count++;
}
else // Receive string head complete
{
string_head_buf[receive_buffer_count] = 0;
if( _str_cmp( &string_head_buf[0],"GPGSA" ) == 0 ) //Compare whith GPGSA string,equ????
{
receive_flag = GSA_MODE; //Yes,receive GPS state.
str_head_flag = _GPGSA_; //Setting string head flag to GPGSA.
}
else //NO,Compare whith GPRMC,
{
if( _str_cmp( &string_head_buf[0],"GPRMC" ) == 0 ) //Receive character equal GPRMC???
{
receive_flag = RMC_TIME; //Yes,receive UTC time.
str_head_flag = _GPRMC_; //Setting string head flag to GPRMC.
}
else //No,
{
if( _str_cmp( &string_head_buf[0],"GPGGA" ) == 0 ) //Receive character equal GPRMC???
{
str_head_flag = _GPGGA_;
receive_flag = GGA_TIME;
}
else
{
if(_str_cmp( &string_head_buf[0],"GPGSV" ) == 0 )
{
str_head_flag = _GPGSV_;
receive_flag = GSV_SUM;
}
else
{
//receive_flag = OTHER; //Not receive anything.
str_head_flag = _OTHER_;
}
}
}
}
receive_buffer_count = 0; //Reset receive counter.
}
}
void __irq_code GPS_data_transmit(void)
{
if(GPS_TX_ready_flag)
{
switch(GPS_TX_gradation_flag)
{
case 1:
GPS_transmit_one_byte(GPGGA_TX_pointer);
break;
case 2:
GPS_transmit_one_byte(GPGSA_TX_pointer);
break;
case 3:
if(_GSV_TX_sum_ < '1')
{
GPS_TX_count = 0;
GPS_TX_gradation_flag++;
}
else
{
GPS_transmit_one_byte(GPGSV1_TX_pointer);
}
break;
case 4:
if(_GSV_TX_sum_ < '2')
{
GPS_TX_count = 0;
GPS_TX_gradation_flag++;
}
else
{
GPS_transmit_one_byte(GPGSV2_TX_pointer);
}
break;
case 5:
if(_GSV_TX_sum_ < '3')
{
GPS_TX_count = 0;
GPS_TX_gradation_flag ++;
}
else
{
GPS_transmit_one_byte(GPGSV3_TX_pointer);
}
break;
case 6:
if(_GSV_TX_sum_ < '4')
{
GPS_TX_count = 0;
GPS_TX_gradation_flag++;
}
else
{
GPS_transmit_one_byte(GPGSV4_TX_pointer);
}
break;
case 7:
GPS_transmit_one_byte(GPRMC_TX_pointer);
break;
default:
GPS_TX_ready_flag = 0;
GPS_TX_count = 0;
break;
}
}
}
void __irq_code GPS_transmit_one_byte(char *transmit_P)
{
char GPS_TX_temp = *(transmit_P + GPS_TX_count);
if(GPS_TX_temp != '\n')
{
if((GPS_TX_temp != ' ') && (GPS_TX_temp != 0))
{
rg.duart.b_tx8 = GPS_TX_temp;
}
GPS_TX_count++;
}
else
{
GPS_TX_count = 0;
GPS_TX_gradation_flag++;
rg.duart.b_tx8 = '\n';
}
}
/******************************************************************************
end
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -