⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e07f264b319b001d114bb919ad30f862

📁 基于ALTERA公司的NIOSII的GPS信息接收系统的设计
💻
字号:
#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 + -