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
|