本文來源于“21ic TI微控制器&處理器論壇”,原貼見底部“閱讀原文”
近短時間在網上買了一個GPS模塊,正好正在學習MSP430單片機,于是決心將GPS模塊與MSP430結合起來,同時將代碼貼出來,發現網上搜到好多資料都要注冊才能下載,有些還要錢。自己動腦,才能自娛自樂。
一、測試篇
剛拿到ATK-NEO-6M這個型號的GPS模塊,有點不大相信,近100塊的東西居然只有3cm那么大一點。之前在網上下載了相關的資料,第一次快速測試肯定是借助電腦,正好msp430開發板上有max232模塊,直接將GPS模塊的TX接max232的TX,RX同樣。PC端安裝u-center,u-center 是由ublox 公司提供的GPS 評估軟件,功能十分強大,可以對我們的ATK-NEO-6M GPS 模塊進行全面的測試。安裝好后,點擊連接/斷開按鈕,選擇你的串口號,一般測試都是選擇自動配置按鈕,也就是那個魔法樣式的按鈕,單擊后會自己配置波特率,如果正常通訊的話,在最右下角的狀態欄會顯示黃色,當GPS模塊已經定位成功的話,會在界面上顯示當前的基本信息,如經度,緯度等。想查看接收到的原本信息,按F8鍵即可顯示。我測試后工作正常,在屋里基本能搜到9顆衛星信號。
二、開發篇
剛拿到GPS模塊,感覺要是開發起來會很麻煩,后來經過實驗,其實很簡單,因為賣家提供的資料已經足夠開發。句段的分析函數都已提供,我們只需將接口寫好即可。接下來先看看我的硬件環境。
硬件環境:MPS430開發板,FYD12864LCD顯示屏,USB轉串口線,ATK-NEO-6M GPS模塊
軟件環境:IAR集成開發環境,串口調試工具,Secure CRT
實現目標:MSP430通過串口2接收到GPS信息,顯示在LCD上,同時通過串口1發送接收到的數據到PC。
1. 先把msp430的句段分析部分調通。
思路:將廠商提過的GPS語句分析部分代碼移植過來,串口手動發送GPS數據,分析完后在LCD上顯示。
將廠商提供的GPS語句分析代碼貼出,(在此僅作為參考學習只用)
GPS.h
<font size="2"># __GPS_H#include <math.h>#include <string.h>#include <stdarg.h>#include <stdio.h>#include "../inc/uart.h"//GPS NMEA-0183協議重要參數結構體定義//衛星信息typedef struct{uchar num; //衛星編號uchar eledeg; //衛星仰角uint azideg; //衛星方位角uchar sn; //信噪比}nmea_slmsg;//UTC時間信息typedef struct{uint year; //年份uchar month; //月份uchar date; //日期uchar hour; //小時uchar min; //分鐘uchar sec; //秒鐘}nmea_utc_time;//NMEA 0183 協議解析后數據存放結構體typedef struct{uchar svnum; //可見衛星數nmea_slmsg slmsg[12]; //最多12顆衛星nmea_utc_time utc; //UTC時間int latitude; //緯度 分擴大100000倍,實際要除以100000uchar nshemi; //北緯/南緯,N:北緯;S:南緯int longitude; //經度 分擴大100000倍,實際要除以100000uchar ewhemi; //東經/西經,E:東經;W:西經uchar gpssta; //GPS狀態:0,未定位;1,非差分定位;2,差分定位;6,正在估算.uchar posslnum; //用于定位的衛星數,0~12.uchar possl[12]; //用于定位的衛星編號uchar fixmode; //定位類型:1,沒有定位;2,2D定位;3,3D定位uint pdop; //位置精度因子 0~500,對應實際值0~50.0uint hdop; //水平精度因子 0~500,對應實際值0~50.0uint vdop; //垂直精度因子 0~500,對應實際值0~50.0int altitude; //海拔高度,放大了10倍,實際除以10.單位:0.1muint speed; //地面速率,放大了1000倍,實際除以10.單位:0.001公里/小時}nmea_msg;//////////////////////////////////////////////////////////////////////////////////////////////////////UBLOX NEO-6M 時鐘脈沖配置結構體typedef struct{uint header; //cfg header,固定為0X62B5(小端模式)uint id; //CFG TP ID:0X0706 (小端模式)uint dlength; //數據長度int interval; //時鐘脈沖間隔,單位為usint length; //脈沖寬度,單位為ussigned char status; //時鐘脈沖配置:1,高電平有效;0,關閉;-1,低電平有效.uchar timeref; //參考時間:0,UTC時間;1,GPS時間;2,當地時間.uchar flags; //時間脈沖設置標志uchar reserved; //保留signed short antdelay; //天線延時signed short rfdelay; //RF延時signed int userdelay; //用戶延時uchar cka; //校驗CK_Auchar ckb; //校驗CK_B}_ublox_cfg_tp;//UBLOX NEO-6M 刷新速率配置結構體typedef struct{uint header; //cfg header,固定為0X62B5(小端模式)uint id; //CFG RATE ID:0X0806 (小端模式)uint dlength; //數據長度uint measrate; //測量時間間隔,單位為ms,最少不能小于200ms(5Hz)uint navrate; //導航速率(周期),固定為1uint timeref; //參考時間:0=UTC Time;1=GPS Time;uchar cka; //校驗CK_Auchar ckb; //校驗CK_B}_ublox_cfg_rate;int NMEA_Str2num(uchar *buf,uchar*dx);void GPS_Analysis(nmea_msg *gpsx,uchar *buf);void NMEA_GPGSV_Analysis(nmea_msg *gpsx,uchar *buf);void NMEA_GPGGA_Analysis(nmea_msg *gpsx,uchar *buf);void NMEA_GPGSA_Analysis(nmea_msg *gpsx,uchar *buf);void NMEA_GPGSA_Analysis(nmea_msg *gpsx,uchar *buf);void NMEA_GPRMC_Analysis(nmea_msg *gpsx,uchar *buf);void NMEA_GPVTG_Analysis(nmea_msg *gpsx,uchar *buf);void Ublox_Cfg_Tp(int interval,int length,signed char status);void Ublox_Cfg_Rate(uint measrate,uchar reftime);# /* __GPS_H */</font>
gps.c
#include "../inc/gps.h"/*******************************************函數名稱:NMEA_Comma_Pos功 能:從buf里面得到第cx個逗號所在的位置參 數:返回值 :0~0XFE,代表逗號所在位置的偏移0XFF,代表不存在第cx個逗號********************************************/uchar NMEA_Comma_Pos(uchar *buf,uchar cx){uchar *p=buf;while(cx){if(*buf=='*'||*buf<' '||*buf>'z')return 0XFF;//遇到'*'或者非法字符,則不存在第cx個逗號if(*buf==',')cx--;buf++;}return buf-p;}/*******************************************函數名稱:NMEA_Pow功 能:m^n函數參 數:返回值 :m^n次方.********************************************/int NMEA_Pow(uchar m,uchar n){int result=1;while(n--)result*=m;return result;}/*******************************************函數名稱:NMEA_Str2num功 能:str轉換為數字,以','或者'*'結束參 數:buf:數字存儲區;dx:小數點位數,返回給調用函數返回值 :轉換后的數值********************************************/int NMEA_Str2num(uchar *buf,uchar*dx){uchar *p=buf;int ires=0,fres=0;uchar ilen=0,flen=0,i;uchar mask=0;int res;while(1) //得到整數和小數的長度{if(*p=='-'){mask|=0X02;p++;} //是負數if(*p==','||(*p=='*'))break; //遇到結束了if(*p=='.'){mask|=0X01;p++;} //遇到小數點了else if(*p>'9'||(*p<'0')) //有非法字符{ilen=0;flen=0;break;}if(mask&0X01)flen++;else ilen++;p++;}if(mask&0X02)buf++; //去掉負號for(i=0;i<ilen;i++) //得到整數部分數據{ires+=NMEA_Pow(10,ilen-1-i)*(buf[i]-'0');}if(flen>5)flen=5; //最多取5位小數*dx=flen; //小數點位數for(i=0;i<flen;i++) //得到小數部分數據{fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');}res=ires*NMEA_Pow(10,flen)+fres;if(mask&0X02)res=-res;return res;}/*******************************************函數名稱:NMEA_GPGSV_Analysis功 能:分析GPGSV信息參 數:gpsx:nmea信息結構體;buf:接收到的GPS數據緩沖區首地址返回值 :********************************************/void NMEA_GPGSV_Analysis(nmea_msg *gpsx,uchar *buf){uchar *p,*p1,dx;uchar len,i,j,slx=0;uchar posx;p=buf;p1=(uchar*)strstr((const char *)p,"$GPGSV");len=p1[7]-'0'; //得到GPGSV的條數posx=NMEA_Comma_Pos(p1,3); //得到可見衛星總數if(posx!=0XFF)gpsx->svnum=NMEA_Str2num(p1+posx,&dx);for(i=0;i<len;i++){p1=(uchar*)strstr((const char *)p,"$GPGSV");for(j=0;j<4;j++){posx=NMEA_Comma_Pos(p1,4+j*4);if(posx!=0XFF)gpsx->slmsg[slx].num=NMEA_Str2num(p1+posx,&dx); //得到衛星編號else break;posx=NMEA_Comma_Pos(p1,5+j*4);if(posx!=0XFF)gpsx->slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx);//得到衛星仰角else break;posx=NMEA_Comma_Pos(p1,6+j*4);if(posx!=0XFF)gpsx->slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx);//得到衛星方位角else break;posx=NMEA_Comma_Pos(p1,7+j*4);if(posx!=0XFF)gpsx->slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx); //得到衛星信噪比else break;slx++;}p=p1+1;//切換到下一個GPGSV信息}}/*******************************************函數名稱:NMEA_GPGGA_Analysis功 能:分析GPGGA信息參 數:gpsx:nmea信息結構體;buf:接收到的GPS數據緩沖區首地址返回值 :********************************************/void NMEA_GPGGA_Analysis(nmea_msg *gpsx,uchar *buf){uchar *p1,dx;uchar posx;p1=(uchar*)strstr((const char *)buf,"$GPGGA");posx=NMEA_Comma_Pos(p1,6); //得到GPS狀態if(posx!=0XFF)gpsx->gpssta=NMEA_Str2num(p1+posx,&dx);posx=NMEA_Comma_Pos(p1,7); //得到用于定位的衛星數if(posx!=0XFF)gpsx->posslnum=NMEA_Str2num(p1+posx,&dx);posx=NMEA_Comma_Pos(p1,9); //得到海拔高度if(posx!=0XFF)gpsx->altitude=NMEA_Str2num(p1+posx,&dx);}/*******************************************函數名稱:NMEA_GPGSA_Analysis功 能:分析GPGSA信息參 數:gpsx:nmea信息結構體;buf:接收到的GPS數據緩沖區首地址返回值 :********************************************/void NMEA_GPGSA_Analysis(nmea_msg *gpsx,uchar *buf){uchar *p1,dx;uchar posx;uchar i;p1=(uchar*)strstr((const char *)buf,"$GPGSA");posx=NMEA_Comma_Pos(p1,2); //得到定位類型if(posx!=0XFF)gpsx->fixmode=NMEA_Str2num(p1+posx,&dx);for(i=0;i<12;i++) //得到定位衛星編號{posx=NMEA_Comma_Pos(p1,3+i);if(posx!=0XFF)gpsx->possl[i]=NMEA_Str2num(p1+posx,&dx);else break;}posx=NMEA_Comma_Pos(p1,15); //得到PDOP位置精度因子if(posx!=0XFF)gpsx->pdop=NMEA_Str2num(p1+posx,&dx);posx=NMEA_Comma_Pos(p1,16); //得到HDOP位置精度因子if(posx!=0XFF)gpsx->hdop=NMEA_Str2num(p1+posx,&dx);posx=NMEA_Comma_Pos(p1,17); //得到VDOP位置精度因子if(posx!=0XFF)gpsx->vdop=NMEA_Str2num(p1+posx,&dx);}/*******************************************函數名稱:NMEA_GPRMC_Analysis功 能:分析GPRMC信息參 數:gpsx:nmea信息結構體;buf:接收到的GPS數據緩沖區首地址返回值 :********************************************/void NMEA_GPRMC_Analysis(nmea_msg *gpsx,uchar *buf){uchar *p1,dx;uchar posx;int temp;float rs;p1=(uchar*)strstr((const char *)buf,"$GPRMC");posx=NMEA_Comma_Pos(p1,1); //得到UTC時間if(posx!=0XFF){temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx); //得到UTC時間,去掉msgpsx->utc.hour=temp/10000;gpsx->utc.min=(temp/100)%100;gpsx->utc.sec=temp%100;}posx=NMEA_Comma_Pos(p1,3); //得到緯度if(posx!=0XFF){temp=NMEA_Str2num(p1+posx,&dx);gpsx->latitude=temp/NMEA_Pow(10,dx+2); //得到°rs=temp%NMEA_Pow(10,dx+2); //得到'gpsx->latitude=gpsx->latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//轉換為°}posx=NMEA_Comma_Pos(p1,4); //南緯還是北緯if(posx!=0XFF)gpsx->nshemi=*(p1+posx);posx=NMEA_Comma_Pos(p1,5); //得到經度if(posx!=0XFF){temp=NMEA_Str2num(p1+posx,&dx);gpsx->longitude=temp/NMEA_Pow(10,dx+2); //得到°rs=temp%NMEA_Pow(10,dx+2); //得到'gpsx->longitude=gpsx->longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//轉換為°}posx=NMEA_Comma_Pos(p1,6); //東經還是西經if(posx!=0XFF)gpsx->ewhemi=*(p1+posx);posx=NMEA_Comma_Pos(p1,9); //得到UTC日期if(posx!=0XFF){temp=NMEA_Str2num(p1+posx,&dx); //得到UTC日期gpsx->utc.date=temp/10000;gpsx->utc.month=(temp/100)%100;gpsx->utc.year=2000+temp%100;}}/*******************************************函數名稱:NMEA_GPVTG_Analysis功 能:分析GPVTG信息參 數:gpsx:nmea信息結構體;buf:接收到的GPS數據緩沖區首地址返回值 :********************************************/void NMEA_GPVTG_Analysis(nmea_msg *gpsx,uchar *buf){uchar *p1,dx;uchar posx;p1=(uchar*)strstr((const char *)buf,"$GPVTG");posx=NMEA_Comma_Pos(p1,7); //得到地面速率if(posx!=0XFF){gpsx->speed=NMEA_Str2num(p1+posx,&dx);if(dx<3)gpsx->speed*=NMEA_Pow(10,3-dx); //確保擴大1000倍}}/*******************************************函數名稱:GPS_Analysis功 能:提取NMEA-0183信息參 數:gpsx:nmea信息結構體;buf:接收到的GPS數據緩沖區首地址返回值 :********************************************/void GPS_Analysis(nmea_msg *gpsx,uchar *buf){NMEA_GPGSV_Analysis(gpsx,buf); //GPGSV解析NMEA_GPGGA_Analysis(gpsx,buf); //GPGGA解析NMEA_GPGSA_Analysis(gpsx,buf); //GPGSA解析NMEA_GPRMC_Analysis(gpsx,buf); //GPRMC解析NMEA_GPVTG_Analysis(gpsx,buf); //GPVTG解析}/*******************************************函數名稱:Ublox_CheckSum功 能:GPS校驗和計算參 數:buf:數據緩存區首地址;len:數據長度;cka,ckb:兩個校驗結果.返回值 :********************************************/void Ublox_CheckSum(uchar *buf,uint len,uchar* cka,uchar*ckb){uint i;*cka=0;*ckb=0;for(i=0;i<len;i++){*cka=*cka+buf[i];*ckb=*ckb+*cka;}}/*******************************************函數名稱:Ublox_Cfg_Tp功 能:配置UBLOX NEO-6的時鐘脈沖輸出參 數:interval:脈沖間隔length:脈沖寬度status:脈沖配置:1,高電平有效;0,關閉;-1,低電平有效.返回值 :********************************************/void Ublox_Cfg_Tp(int interval,int length,signed char status){/*_ublox_cfg_tp *cfg_tp=(_ublox_cfg_tp *)USART2_TX_BUF;cfg_tp->header=0X62B5; //cfg headercfg_tp->id=0X0706; //cfg tp idcfg_tp->dlength=20; //數據區長度為20個字節.cfg_tp->interval=interval; //脈沖間隔,uscfg_tp->length=length; //脈沖寬度,uscfg_tp->status=status; //時鐘脈沖配置cfg_tp->timeref=0; //參考UTC 時間cfg_tp->flags=0; //flags為0cfg_tp->reserved=0; //保留位為0cfg_tp->antdelay=820; //天線延時為820nscfg_tp->rfdelay=0; //RF延時為0nscfg_tp->userdelay=0; //用戶延時為0nsUblox_CheckSum((uchar*)(&cfg_tp->id),sizeof(_ublox_cfg_tp)-4,&cfg_tp->cka,&cfg_tp->ckb);while(DMA1_Channel7->CNDTR!=0); //等待通道7傳輸完成UART_DMA_Enable(DMA1_Channel7,sizeof(_ublox_cfg_tp)); //通過dma發送出去*/}/*******************************************函數名稱:Ublox_Cfg_Rate功 能:配置UBLOX NEO-6的更新速率參 數:measrate:測量時間間隔,單位為ms,最少不能小于200ms(5Hz)reftime:參考時間,0=UTC Time;1=GPS Time(一般設置為1)返回值 :********************************************/void Ublox_Cfg_Rate(uint measrate,uchar reftime){/*_ublox_cfg_rate *cfg_rate=(_ublox_cfg_rate *)USART2_TX_BUF;if(measrate<200)return; //小于200ms,直接退出cfg_rate->header=0X62B5; //cfg headercfg_rate->id=0X0806; //cfg rate idcfg_rate->dlength=6; //數據區長度為6個字節.cfg_rate->measrate=measrate;//脈沖間隔,uscfg_rate->navrate=1; //導航速率(周期),固定為1cfg_rate->timeref=reftime; //參考時間為GPS時間Ublox_CheckSum((uchar*)(&cfg_rate->id),sizeof(_ublox_cfg_rate)-4,&cfg_rate->cka,&cfg_rate->ckb);while(DMA1_Channel7->CNDTR!=0); //等待通道7傳輸完成UART_DMA_Enable(DMA1_Channel7,sizeof(_ublox_cfg_rate));//通過dma發送出去*/}
以上為GPS相關代碼,下面為MSP430相關代碼
uart.h
# _UART_H_# _UART_H_#void UartInit(void);void SendData(uchar dat);void SendByte(uchar *pData);void SendString(char *s);# /* __UART_H */
uart.c
#void UartInit(void){//串口1配置P3DIR |= BIT4; //p3.4設為輸出P3SEL |= BIT4 + BIT5; //P3.4,5設置為TXD/RXDME1 |= UTXE0 + URXE0; //enable tx and rxUCTL0 = 0x00; //reset as 0UCTL0 |= CHAR; //8 bit transferUTCTL0 = 0x00; //reset as 0UTCTL0 |= SSEL0; //select aclk(8M)UBR00 = 0x03;UBR10 = 0x00; //波特率為 9600(ACLK為8MHz)UMCTL0 = 0x4A;UCTL0 &= ~SWRST; // reset UARTIE1 |= URXIE0; // enable rx inerrupt//串口2配置P3DIR |= BIT6; //p3.6設為輸出P3SEL |= BIT6 + BIT7; //P3.6,7設置為TXD/RXDME2 |= URXE1 + UTXE1; //enable tx and rxUCTL1 = 0x00; //reset as 0UCTL1 |= CHAR; //8 bit transferUTCTL1 = 0x00; //reset as 0UTCTL1 |= SSEL0; //select mclkUBR01 = 0x03;UBR11 = 0x00; //波特率為 9600(ACLK為8MHz)UMCTL1 = 0x4A;UCTL1 &= ~SWRST; // reset UARTIE2 |= URXIE1; // enable rx inerrupt}void SendData(unsigned char dat){TXBUF0 = dat;while(!(IFG1 & UTXIFG0));//IFG1 &= ~(UTXIFG0);}void SendString(char *s){while(*s){SendData(*s++);}}void SendByte(uchar *pData){uchar i;for(i = 0; i < 8; i++){SendData(pData[i]);}}
該串口操作為配置串口1和串口2波特率都為9600(之前看了GPS模塊的應用手冊,發現默認的波特率為38400
但我將430的波特率設為38400發現接收到的數據為亂碼,于是干脆直接將GPS的波特率設為9600,我直接將模塊上的R5電阻取了,終于接收到正常的數據.)
main.c
####uchar Welcom1[] = "歡迎來到嵌入式";uchar Welcom2[] = "************";uchar Welcom3[] = "版主:*******";uchar Welcom4[] = "DIY 實驗室";uchar latitude[] = "Lat: ";uchar longitude[] = "Long: ";uchar elevation[] = "Ele: ";uchar currTime[] = "Time: ";const uchar *mode[4] = {"Fail", "Fail", "2D", "3D"};uchar RxBuf[300], TxBuf[300],RxData[9];uchar RxLen = 0;uchar RxTempLen = 0;uchar rev_flag = 0;char dtbuf[50];nmea_msg gpsx;uchar swt = 1;void Show_GPS_Info1(nmea_msg gpsx){float tp;//得到經度字符串tp=gpsx.longitude;sprintf((char *)dtbuf,"Lon: %.5f %1c",tp/=100000,gpsx.ewhemi);DisplayString(0, 0, dtbuf);//得到緯度字符串tp=gpsx.latitude;sprintf((char *)dtbuf,"Lat: %.5f %1c",tp/=100000,gpsx.nshemi);DisplayString(0, 1, dtbuf);//得到高度字符串tp=gpsx.altitude;sprintf((char *)dtbuf,"Alt: %.1fm",tp/=10);DisplayString(0, 2, dtbuf);//得到速度字符串tp=gpsx.speed;sprintf((char *)dtbuf,"Speed:%.3fkm/h",tp/=1000);DisplayString(0, 3, dtbuf);}void Show_GPS_Info2(nmea_msg gpsx){//定位狀態if(gpsx.fixmode<=3){sprintf((char *)dtbuf,"Fix Mode: %s",mode[gpsx.fixmode]);DisplayString(0, 0, dtbuf);}//用于定位的衛星數sprintf((char *)dtbuf,"Val sat: %02d",gpsx.posslnum);DisplayString(0, 1, dtbuf);//可見衛星數sprintf((char *)dtbuf,"Vis sat: %02d",gpsx.svnum%100);DisplayString(0, 2, dtbuf);}void Show_GPS_Info3(nmea_msg gpsx){//顯示UTC日期sprintf((char *)dtbuf,"Date:%04d/%02d/%02d",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date);DisplayString(0, 0, dtbuf);//顯示UTC時間sprintf((char *)dtbuf,"Time:%02d:%02d:%02d",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec);DisplayString(0, 1, dtbuf);}void main(){volatile uint i;WDTCTL = WDTPW + WDTHOLD; //關閉看門狗BCSCTL1 &= ~XT2OFF; // XT2= HF XTALdo{IFG1 &= ~OFIFG; // Clear OSCFault flagfor (i = 0xFF; i > 0; i--); // Time for flag to set}while ((IFG1 & OFIFG)); // OSCFault flag still set?//MCLK=8M,SCLK=1MBCSCTL2 |= SELM_2 + SELS + DIVS_3; // MCLK= XT2 (safe)Delay_ms(500);UartInit();Delay_ms(500);P3DIR &= (~BIT2 + ~BIT3);LCDReset();DisplayString(1, 0, Welcom1);DisplayString(1, 1, Welcom2);DisplayString(1, 2, Welcom3);DisplayString(1, 3, Welcom4);Delay_ms(2000);LCDClear();Delay_ms(1000);/*DisplayString(0, 0, latitude);DisplayString(0, 1, longitude);DisplayString(0, 2, elevation);DisplayString(0, 3, currTime);*/SendString("Lixiaoming\n");_EINT();while(1){//SendString("UART0 test!\n");if(!(P3IN & BIT2)){swt++;if(swt == 4)swt = 1;}if(rev_flag == 1){int i,len = 0;len = RxLen;for(i = 0; i < len; i++)TxBuf[i] = RxBuf[i];RxLen = 0;TxBuf[i] = 0;GPS_Analysis(&gpsx,TxBuf);switch(swt){case 1: LCDClear(); Show_GPS_Info1(gpsx); break;case 2: LCDClear(); Show_GPS_Info2(gpsx); break;default: LCDClear(); Show_GPS_Info3(gpsx); break;}SendString(TxBuf);rev_flag = 0;}//Delay_ms(1000);}}# vector = UART0RX_VECTOR__interrupt void UART0RxISR(void){//接收來自串口的數據while(!(IFG1 & UTXIFG0));RxBuf[RxTempLen++] = RXBUF0;while(RxBuf[RxTempLen-1] == '\n' && RxBuf[RxTempLen-2] == '\r' ){RxLen = RxTempLen;RxTempLen = 0;rev_flag = 1;}}# vector = UART1RX_VECTOR__interrupt void UART1RxISR(void){//接收來自串口的數據while(!(IFG2 & UTXIFG1));RxBuf[RxTempLen++] = RXBUF1;while(RxBuf[RxTempLen-1] == '\n'){RxLen = RxTempLen;RxTempLen = 0;rev_flag = 1;}}
其中,有關LCD顯示部分在其他博文中會詳細說到.
將程序燒到430后,上電,打開串口調試工具,發送文本如下:
$GPGGA,023543.00,2308.28715,N,11322.09875,E,1,06,1.49,41.6,M,-5.3,M,,*7D
就會收到發回來的數據跟發送的一樣,同時LCD上顯示海拔為41.6m.
說明能對數據接受并進行正確處理了。
后面要做的便是將串口0的接收中斷代碼復制到串口1接收中斷代碼即可。
同樣上電,這時LCD可顯示信息,但顯示的數據都為0,說明GPS還沒有定位成功。等2~3分鐘左右,GPS模塊上的指示燈開始閃爍時,這時從LCD上可看到當前的經度、緯度、高度、UTC時間,同時用ScuetCRT連接,可看到430發回來接受到的原始數據。
下圖為實驗的結果,時間顯示稍微有點問題,因為沒有轉換還是其他。不過忙了幾天終于將GPS弄好了,下一步將編寫linux驅動。。。下面曬一下成果^-^.
PC串口接收到的數據如下:
GPRMC,134856.00,A,2232.50576,N,11354.64802,E,0.084,,251113,,,A*7EGPGSV,3,2,09,22,75,191,27,25,58,074,22,29,08,122,16,31,48,276,19*76utc temp: 134857latitude temp: 223250578longitude temp: 1135464798utc.date temp: 251113GPRMC,134857.00,A,2232.50578,N,11354.64798,E,0.173,,251113,,,A*74GPGSV,3,2,09,22,75,191,27,25,58,074,23,29,08,122,15,31,48,276,20*7Eutc temp: 134858latitude temp: 223250575longitude temp: 1135464785utc.date temp: 251113GPRMC,134858.00,A,2232.50575,N,11354.64785,E,0.140,,251113,,,A*7AGPGSV,3,2,09,22,75,191,27,25,58,074,23,29,08,122,15,31,48,276,19*74utc temp: 134859latitude temp: 223250575longitude temp: 1135464782utc.date temp: 251113GPRMC,134859.00,A,2232.50575,N,11354.64782,E,0.130,,251113,,,A*7BGPGSV,3,2,09,22,75,191,27,25,58,074,23,29,08,122,15,31,48,276,20*7Eutc temp: 134900latitude temp: 223250570longitude temp: 1135464784utc.date temp: 251113GPRMC,134900.00,A,2232.50570,N,11354.64784,E,0.112,,251113,,,A*75