📄 e07f264b319b001d114bb919ad30f862
字号:
#include <stdio.h>
#include "system.h"
#include "alt_types.h"
#include "altera_avalon_uart_regs.h"
#include "sys/alt_irq.h"
#include <string.h>
char* gps_string;
int string_index = 0;
int section_id = 0;
int temp_index = 0;
//gps信息类型
char* GPS_DATA_TYPE;
//gps中的时间信息
char* GPS_DATA_TIME;
//gps中的状态信息
char* GPS_DATA_STATUS;
//gps中的纬度信息
char* GPS_DATA_LATITUDE;
//gps中的南北半球信息
char* GPS_DATA_NS_HEMISPHERE;
//gps中的经度信息
char* GPS_DATA_LONGITUDE;
//gps中的东西半球信息
char* GPS_DATA_WE_HEMISPHERE;
//gps中的速度信息
char* GPS_DATA_VELOCITY;
//gps中的方位角信息
char* GPS_DATA_POS_ANGLE;
//gps中的日期信息
char* GPS_DATA_DATE;
//gps中的地磁信息
char* GPS_DATA_GEOMAGNETISM;
//gps中的地磁方向信息
char* GPS_DATA_GM_DIRECTION;
void analyse_gps_data(char* string)
{
int i;
for(i = 0;i < string_index;i++){
//帧头
if(gps_string[i] == '$'){
section_id = 0;
temp_index = 0;
}
else if(gps_string[i] == 13){
break;
}
else if(gps_string[i] == ','){
section_id++;
switch(section_id){
case 1:
GPS_DATA_TYPE[temp_index] = '\0';
break;
case 2:
GPS_DATA_TIME[temp_index] = '\0';
break;
case 3:
GPS_DATA_STATUS[temp_index] = '\0';
break;
case 4:
GPS_DATA_LATITUDE[temp_index] = '\0';
break;
case 5:
GPS_DATA_NS_HEMISPHERE[temp_index] = '\0';
break;
case 6:
GPS_DATA_LONGITUDE[temp_index] = '\0';
break;
case 7:
GPS_DATA_WE_HEMISPHERE[temp_index] = '\0';
break;
case 8:
GPS_DATA_VELOCITY[temp_index] = '\0';
break;
case 9:
GPS_DATA_POS_ANGLE[temp_index] = '\0';
break;
case 10:
GPS_DATA_DATE[temp_index] = '\0';
break;
case 11:
GPS_DATA_GEOMAGNETISM[temp_index] = '\0';
break;
default:
break;
}
temp_index = 0;
}
else{
switch(section_id){
case 0:
GPS_DATA_TYPE[temp_index] = string[i];
temp_index++;
break;
case 1:
GPS_DATA_TIME[temp_index] = string[i];
temp_index++;
break;
case 2:
GPS_DATA_STATUS[temp_index] = string[i];
temp_index++;
break;
case 3:
GPS_DATA_LATITUDE[temp_index] = string[i];
temp_index++;
break;
case 4:
GPS_DATA_NS_HEMISPHERE[temp_index] = string[i];
temp_index++;
break;
case 5:
GPS_DATA_LONGITUDE[temp_index] = string[i];
temp_index++;
break;
case 6:
GPS_DATA_WE_HEMISPHERE[temp_index] = string[i];
temp_index++;
break;
case 7:
GPS_DATA_VELOCITY[temp_index] = string[i];
temp_index++;
break;
case 8:
GPS_DATA_POS_ANGLE[temp_index] = string[i];
temp_index++;
break;
case 9:
GPS_DATA_DATE[temp_index] = string[i];
temp_index++;
break;
case 10:
GPS_DATA_GEOMAGNETISM[temp_index] = string[i];
temp_index++;
break;
case 11:
GPS_DATA_GM_DIRECTION[temp_index] = string[i];
temp_index++;
break;
default:
break;
}
}
}
GPS_DATA_GM_DIRECTION[temp_index] = '\0';
string_index = 0;
}
void display_gps_information()
{
//gps信息类型
printf("type:%s\n",GPS_DATA_TYPE);
drawString(50,50,"type")
//gps中的时间信息
printf("time:%s\n",GPS_DATA_TIME);
//gps中的状态信息
printf("status:%s\n",GPS_DATA_STATUS);
//gps中的纬度信息
printf("latitude:%s\n",GPS_DATA_LATITUDE);
//gps中的南北半球信息
printf("N/S:%s\n",GPS_DATA_NS_HEMISPHERE);
//gps中的经度信息
printf("longitude:%s\n",GPS_DATA_LONGITUDE);
//gps中的东西半球信息
printf("W/E:%s\n",GPS_DATA_WE_HEMISPHERE);
//gps中的速度信息
printf("velocity:%s\n",GPS_DATA_VELOCITY);
//gps中的方位角信息
printf("angle:%s\n",GPS_DATA_POS_ANGLE);
//gps中的日期信息
printf("date:%s\n",GPS_DATA_DATE);
//gps中的地磁信息
printf("geomagnetism:%s\n",GPS_DATA_GEOMAGNETISM);
//gps中的地磁方向信息
printf("gm_direction:%s\n",GPS_DATA_GM_DIRECTION);
}
void receive_gps_string(char gps_code)
{
if(gps_code != 13){
gps_string[string_index] = gps_code;
string_index++;
}
else{
gps_string[string_index] = '\0';
analyse_gps_data(gps_string);
display_gps_information();
}
}
static void handle_uart_keyboard_interrups(void* context, alt_u32 id)
{
char code;
if((IORD_ALTERA_AVALON_UART_STATUS(GPS_UART_0_BASE)&(0x80)) == 0x80){
code = IORD_ALTERA_AVALON_UART_RXDATA(GPS_UART_0_BASE);
receive_gps_string(code);
}
IOWR_ALTERA_AVALON_UART_STATUS(GPS_UART_0_BASE, 0x0);
}
void init_uart_keyboard()
{
IOWR_ALTERA_AVALON_UART_CONTROL(GPS_UART_0_BASE, 0x80);
IOWR_ALTERA_AVALON_UART_STATUS(GPS_UART_0_BASE, 0x0);
alt_irq_register(GPS_UART_0_IRQ,NULL,handle_uart_keyboard_interrups);
}
void init_gps_information()
{
//所有的gps信息字符串
gps_string = malloc(1000);
//GPRMC格式
GPS_DATA_TYPE = malloc(7);
//当前位置的格林尼治时间,格式为hhmmss
GPS_DATA_TIME = malloc(7);
//状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。
GPS_DATA_STATUS = malloc(2);
//纬度, 格式为ddmm.mmmm
GPS_DATA_LATITUDE = malloc(10);
//标明南北半球, N 为北半球、S为南半球
GPS_DATA_NS_HEMISPHERE = malloc(2);
//经度,格式为dddmm.mmmm
GPS_DATA_LONGITUDE = malloc(10);
//标明东西半球,E为东半球、W为西半球
GPS_DATA_WE_HEMISPHERE = malloc(2);
//地面上的速度,范围为0.0到999.9
GPS_DATA_VELOCITY = malloc(6);
//方位角,范围为000.0到 359.9 度
GPS_DATA_POS_ANGLE = malloc(6);
//日期, 格式为ddmmyy
GPS_DATA_DATE = malloc(7);
//地磁变化,从000.0到 180.0 度
GPS_DATA_GEOMAGNETISM = malloc(6);
//地磁变化方向,为E 或 W
GPS_DATA_GM_DIRECTION = malloc(2);
}
int main()
{
init_gps_information();
init_uart_keyboard();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -