4913|6

1012

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

lm3s8962开发板实验,uart读取并简单解码GPS [复制链接]

通过几天实验终于能够正常的解析一些关键数据了
走了些弯路,开始没有在startup文件中注册中断,所以中断不能执行,并且后来使用了一个与开发代码有冲突的软件库同样造成了中断不能够执行。

贴上代码:
#include <hw_ints.h>
#include <hw_memmap.h>
#include <hw_types.h>
#include <sysctl.h>
#include <string.h>
#include <stdio.h>
#include <uart.h>
#include <gpio.h>
#include <interrupt.h>
#include <lm3s8962.h>  
#include "rit128x96x4.h"

     char cc[100];//gps收到的语句缓存
     int i=0;
     int j=0;
     int needprocess=0;
     char outbuf[50];
     int k=0;
     typedef  struct gps{\\用于储存解析出来gps数据的结构体
     char stat[2];
     char lon_v[11];
     char lon[2];
     char lat_v[10];
     char lat[2];
     char hh[3];
     char mm[3];
     char sec[3];
     char speed[7];
     }gps;
      struct gps gpsinfo;
                   
void
UART0IntHandler(void)\\uart0中断
{
    unsigned long ulStatus;

    //
    // Get the interrrupt status.
    //
    ulStatus = UARTIntStatus(UART0_BASE, true);

    //
    // Clear the asserted interrupts.
    //
    UARTIntClear(UART0_BASE, ulStatus);
   
    //
    // Loop while there are characters in the receive FIFO.
    //
    while(UARTCharsAvail(UART0_BASE))
    {
       
        char buf;
        buf = UARTCharGetNonBlocking(UART0_BASE);
        if(buf=='$'){\\gps语句每行的开头是$
        i=0;
        if(needprocess==1){\\如果上次收到的是$GPRMC则开始接收下一行时不缓存数据而是解析数据
        //解析状态,state在语句的第十九个字符处,请参考NMEA格式说明
        gpsinfo.stat[0]=cc[18];
        //get latitude
        gpsinfo.lat[0]=cc[30];
        for(k=0;k<9;k++)gpsinfo.lat_v[k]=cc[k+20];
        //get longtitude
        gpsinfo.lon[0]=cc[43];
        for(k=0;k<10;k++)gpsinfo.lon_v[k]=cc[k+32];
        //get utc time
        gpsinfo.hh[0]=cc[7];
        gpsinfo.hh[1]=cc[8];
        gpsinfo.mm[0]=cc[9];
        gpsinfo.mm[1]=cc[10];
        gpsinfo.sec[0]=cc[11];
        gpsinfo.sec[1]=cc[12];
        //get speed
        if(cc[45]!=','){   
        for(k=0;cc[k+46]!=',';k++)    gpsinfo.speed[k]= cc[k+45];
        }else{
        gpsinfo.speed[0]='0';
        gpsinfo.speed[1]='\0';
        }
           //reset process flag
        needprocess=0;
        }
        for(j=0;j<100;j++)cc[j]='\0';
        }
        else if(i==50){
         if(cc[0]=='$' && cc[1]=='G'&& cc[2]=='P'&& cc[3]=='R'&& cc[4]=='M'&& cc[5]=='C')    needprocess=1;\\检测缓存是否以$GPRMC开头,是的话设置needprocess为一,
        }
        else if(i>100){
        i=0;
        for(j=0;j<100;j++)cc[j]='\0';
        }
        else i++;
        cc=buf;
    }
}
int
main(void)
{
    //
    // Set the clocking to run directly from the crystal.
    //
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);


        RIT128x96x4Init(1000000);
\\为字符串设置结束符,防止写屏时溢出
    gpsinfo.stat[1]='\0';
    gpsinfo.lat[1]='\0';
    gpsinfo.lon[1]='\0';
    gpsinfo.hh[2]='\0';
    gpsinfo.mm[2]='\0';
    gpsinfo.sec[2]='\0';
 


    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
   
    IntMasterEnable();
   


    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
   
   
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,
                        (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                         UART_CONFIG_PAR_NONE));


    IntEnable(INT_UART0);
    UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);

   
        while(1)
    {       
     
        //print state
        RIT128x96x4StringDraw(gpsinfo.stat,48,0,15);
        RIT128x96x4StringDraw("State:",0,0,15);
        //print latitude
        RIT128x96x4StringDraw(gpsinfo.lat_v,8,30,15);
        RIT128x96x4StringDraw(gpsinfo.lat,0,30,15);
        //print longtitude
        RIT128x96x4StringDraw(gpsinfo.lon_v,8,40,15);
        RIT128x96x4StringDraw(gpsinfo.lon,0,40,15);
       
        //print speed
        RIT128x96x4StringDraw(gpsinfo.speed,36,50,15);
        RIT128x96x4StringDraw("speed",0,50,15);
       
       
        SysCtlDelay(SysCtlClockGet() / 12);
    }
}


在startup.s文件中需要设置中断




;******************************************************************************
;
; External declaration for the interrupt handler used by the application.
;
;******************************************************************************
        EXTERN  UART0IntHandler  //这一行在原来的文件中没有,UART0IntHandler为中断执行的函数名
;******************************************************************************
;
; The vector table.
;
;******************************************************************************
        EXPORT  __Vectors
__Vectors
        DCD     StackMem + Stack            ; Top of Stack
        DCD     Reset_Handler               ; Reset Handler
        DCD     NmiSR                       ; NMI Handler
        DCD     FaultISR                    ; Hard Fault Handler
        DCD     IntDefaultHandler           ; MPU Fault Handler
        DCD     IntDefaultHandler           ; Bus Fault Handler
        DCD     IntDefaultHandler           ; Usage Fault Handler
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; SVCall Handler
        DCD     IntDefaultHandler           ; Debug Monitor Handler
        DCD     0                           ; Reserved
        DCD     IntDefaultHandler           ; PendSV Handler
        DCD     IntDefaultHandler           ; SysTick Handler
        DCD     IntDefaultHandler           ; GPIO Port A
        DCD     IntDefaultHandler           ; GPIO Port B
        DCD     IntDefaultHandler           ; GPIO Port C
        DCD     IntDefaultHandler           ; GPIO Port D
        DCD     IntDefaultHandler           ; GPIO Port E
        DCD     UART0IntHandler           ; UART0  //这里来设置uart0的中断,原来来是IntDefaultHandler,将其改为中断执行的函数名
        DCD     IntDefaultHandler           ; UART1
        DCD     IntDefaultHandler           ; SSI
        DCD     IntDefaultHandler           ; I2C

接上串口的gps就可以显示数据了

关于NMEA的格式请看我发的另一贴https://bbs.eeworld.com.cn/thread-209501-1-1.html
查看本帖全部内容,请登录或者注册

DSC_0048.JPG (226.8 KB, 下载次数: 0)

DSC_0048.JPG

最新回复

顶。。学习。。。  详情 回复 发表于 2010-11-25 08:59
 
点赞 关注

回复
举报

1012

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
都没人关心含有gps 的应用?
 
 

回复

155

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

你好!我关心GPS问题

能否将代码发我邮箱  61305608@163.com      我想将GPS数据解析并发往指定IP 
 
个人签名http://www.tdhj.cn
 
 

回复

2131

帖子

0

TA的资源

至上芯片

4
 

回复 板凳 bjmonsoon 的帖子

如果有问题可以一起讨论一下
 
个人签名处处留心皆学问!
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 楼主 ssawee 的帖子

这是全部代码吗?  能不能贴上附件?
 
个人签名机遇总是给有准备的人呢
 
 

回复

1012

帖子

0

TA的资源

五彩晶圆(初级)

6
 

回复 5楼 flyingbing 的帖子

工程的压缩包放在这个帖子里

https://bbs.eeworld.com.cn/thread-218377-1-2.html
 
 
 

回复

849

帖子

0

TA的资源

纯净的硅(高级)

7
 
顶。。学习。。。
 
个人签名只有想不到,没有做不到。
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表