全球衛星定位系統實際上是由24 顆衛星所組成,其中有3 顆為備用衛星,這些衛星分布于距地表20,200 公里的上空,而且分屬于6 個軌道面;衛星軌道面傾斜角為55 度﹐提供全球全天候﹐每秒一次﹐持續不斷的定位訊號。這些衛星每11 小時58 分環繞地球一次,即每天繞過您的頭頂二次,就像是月球一樣不停地繞著地球旋轉,其速度約每秒1.8 哩。這些衛星需要地面管制站隨時加以監控是否GPS 衛星在其正確的軌道上及正常運作,另外監控中心可上傳資料給衛星,衛星再將這些信息下傳給GPS 使用者使用。地面共有五個監控中心,四個上傳資料站及一個控制中心,這些控制站以緯度來劃分其所控制的衛星。在概念上﹐GPS 是代表著整個系統﹐包括天空上的衛星、地面控制站及GPS 接收機。不過一般而言﹐GPS 即意指一個GPS 接收機﹐這是因為我們在使用上多半只會接觸GPS 接收機的緣故。一般所使用之GPS 接收機在任何時刻接收到4 顆或更多的衛星。
簡單的說GPS 如何運作:每一顆衛星會告訴您使用的接收機三件事,我是第幾號衛星,我現位置在那里,我什么時候送這訊息給您。當您的GPS 接收機接收到這些資料后會將星歷資料及Almanac 存起來使用,這些資料也用做修正GPS 接收機上的時間。GPS 接收機比較每一衛星訊號接收到的時間及本身接收機的時間的不同,而計算出每一衛星道接收機的距離。接收機若在接收到更多衛星時,它可利用三角公式計算出接收機所在位置。三顆衛星可做所謂2D 定位(經度及緯度),四顆或更多衛星可做所謂3D 定位(經度、緯度及高度)。接收機繼續不段地更新您的位置,所以它可計算出您的移動方向及速度。
GPRMC
推薦定位信息(GPRMC)
例:$GPRMC,154717.000, A ,3906.1439, N ,11720.8569, E ,0.00,331.02,050611, , , A*6B
$GPRMC, <1> ,<2>, <3> ,<4>, <5> ,<6>, <7>, <8> , <9> ,<10>,<11>,<12>*hh
<1> UTC時間,hhmmss.sss(時分秒.毫秒)格式
<2> 定位狀態,A=有效定位,V=無效定位
<3> 緯度ddmm.mmmm(度分)格式(前面的0也將被傳輸)
<4> 緯度半球N(北半球)或S(南半球)
<5> 經度dddmm.mmmm(度分)格式(前面的0也將被傳輸)
<6> 經度半球E(東經)或W(西經)
<7> 地面速率(000.0~999.9節,前面的0也將被傳輸)
<8> 地面航向(000.0~359.9度,以正北為參考基準,前面的0也將被傳輸)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也將被傳輸)
<11> 磁偏角方向,E(東)或W(西)
<12> 模式指示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=數據無效)
GPGGA
GPS固定數據輸出語句($GPGGA)
這是一幀GPS定位的主要數據,也是使用最廣的數據。
起始引導符及語句格式說明(本句為GPS定位數據); 圖中只是示意,天線要接到戶外,否則信號很難接收 二、2440的串口1接GPS模塊 程序如下: #include "def.h" /* int isdigit(char c) int my_atoi(char * pzNum) //把字符串str轉換成int類型 nLen = strlen(pzNum); nIndex = 0; return nRt; Clk0_Disable(); Uart_Printf("n====== GPS Test program start ======n"); sprintf(buf,"%c%c",p[0],p[1]);
$GPGGA 語句包括17個字段:語句標識頭,世界時間,緯度,緯度半球,經度,經度半球,定位質量指示,使用衛星數量,水平精確度,海拔高度,高度單位,大地水準面高度,高度單位,差分GPS數據期限,差分參考基站標號,校驗和結束標記(用回車符
例:$GPGGA,154717.000,3906.1439, N ,11720.8569, E , 1 , 05,1.6, 23.2,M,-2.3,M, , 0000*74
其標準格式為:$GPGGA, (1) , (2) ,(3), (4) ,(5),(6),(7),(8), (9),M,(10),M,(11),(12) *hh(CR)(LF)
<1> UTC時間,格式為hhmmss.sss;
<2> 緯度,格式為ddmm.mmmm(第一位是零也將傳送);
<3> 緯度半球,N或S(北緯或南緯)
<4> 經度,格式為dddmm.mmmm(第一位零也將傳送);
<5> 經度半球,E或W(東經或西經)
<6> GPS狀態, 0未定位, 1非差分定位, 2差分定位, 3無效PPS, 6正在估算
<7> 使用衛星數量,從00到12(第一個零也將傳送)
<8> 水平精確度,0.5到99.9
<9> 天線離海平面的高度,-9999.9到9999.9米
M 指單位米
<10> 大地水準面高度,-9999.9到9999.9米
M 指單位米
<11> 差分GPS數據期限(RTCM SC-104),最后設立RTCM傳送的秒數量,如不是差分定位則為空
<12> 差分參考基站標號,從0000到1023(首位0也將傳送)。
* 語句結束標志符
xx 從$開始到*之間的所有ASCII碼的異或校驗和
GPGSA
$GPGSA : GPS DOP and Active Satellites(GSA)當前衛星信息
例:$GPGSA,A,3,28,02,10,23,04,,,,,,,,2.4,1.6,1.8*36
字段1:定位模式,A=自動手動2D/3D,M=手動2D/3D
字段2:定位類型,1=未定位,2=2D定位,3=3D定位
字段3:PRN碼(偽隨機噪聲碼),第1信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段4:PRN碼(偽隨機噪聲碼),第2信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段5:PRN碼(偽隨機噪聲碼),第3信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段6:PRN碼(偽隨機噪聲碼),第4信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段7:PRN碼(偽隨機噪聲碼),第5信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段8:PRN碼(偽隨機噪聲碼),第6信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段9:PRN碼(偽隨機噪聲碼),第7信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段10:PRN碼(偽隨機噪聲碼),第8信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段11:PRN碼(偽隨機噪聲碼),第9信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段12:PRN碼(偽隨機噪聲碼),第10信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段13:PRN碼(偽隨機噪聲碼),第11信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段14:PRN碼(偽隨機噪聲碼),第12信道正在使用的衛星PRN碼編號(00)(前導位數不足則補0)
字段15:PDOP綜合位置精度因子(0.5 - 99.9)
字段16:HDOP水平精度因子(0.5 - 99.9)
字段17:VDOP垂直精度因子(0.5 - 99.9)
字段18:校驗值
GPGSV
可視衛星狀態輸出語句($GPGSV)
例: $GPGSV, 3 , 1 , 12, 04, 51, 261, 44, 28,45,179,27,10,18,192,26,02, 12,250, 44*7C
標準格式: $GPGSV,(1),(2),(3),(4),(5),(6),(7), ……………… (4),(5),(6),(7)*hh(CR)(LF)
各部分含義為:
(1)總的GSV語句電文數;2;
(2)當前GSV語句號:1;
(3)可視衛星總數:08;
(4)PRN碼(偽隨機噪聲碼) 也可以認為是衛星編號
(5)仰角(00~90度):33度;
(6)方位角(000~359度):240度;
(7)信噪比(00~99dB):45dB(后面依次為第10,16,17號衛星的信息);
*總和校驗域;
hh 總和校驗數:78;
(CR)(LF)回車,換行。
注:每條語句最多包括四顆衛星的信息,每顆衛星的信息有四個數據項,即:
(4)-衛星號,(5)-仰角,(6)-方位角,(7)-信噪比。
一、GPS接PC機,用超級終端接收信息
//////////////////////////////////////////////////////////////////////////////////////////////
#define GLOBAL_CLK 1
/*
*********************************************************
* 頭文件
*********************************************************
*/
#include
#include
#include
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
/*
*********************************************************
* 常量
*********************************************************
*/
*********************************************************
* 變量
*********************************************************
*/
{
if(c>='0' && c <='9') return 1;
else return 0;
}
{
int nLen;
int nIndex;
int bFlag;
int nRt;
if (pzNum == NULL)
return 0;
if (nLen <= 0)
return 0;
bFlag = TRUE;
if (!isdigit(pzNum[0]))
{
if (pzNum[0] == '-')
bFlag = FALSE;
else if (pzNum[0] == '+')
bFlag = TRUE;
else
return 0;
nIndex ++;
}
nRt = 0;
for (; nIndex < nLen; nIndex++)
{
if (!isdigit(pzNum[nIndex]))
break;
nRt = nRt * 10 + (pzNum[nIndex]-'0');
}
if (!bFlag)
nRt = -nRt;
}
void Main(void)
{
int i;
U8 key;
U32 mpll_val = 0 ;
char Buffer[256];
char buf[20];
char *p;
Port_Init(); //端口初始化
Isr_Init(); //中斷初始化
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(key, 12);
cal_cpu_bus_clk();
Uart_Init(0,0,115200); //串口初始化 波特率為115200
Uart_Init(0,1,9600);
Uart_Select(0); //選者串口0
Clk1_Disable();
while(1)
{
i=0;
Uart_Select(1);
Uart_GetString(Buffer); //讀取一段信息
Uart_Select(0);
p = strtok(Buffer+1, ","); //將字符串 Buffer+1 以","為界,讀取第一個單詞,
if (strcmp(p,"$GPRMC") == 0) //找到"$GPRMC"
{
Uart_Printf("%sn", p);
p = strtok(NULL, ","); //得到協調世界時間
Uart_Printf("Current Time: %2d:",(my_atoi(buf)+8)%24); //顯示小時: 協調世界時間+8 轉換為北京時間
Uart_Printf("%c%c:%c%cn",p[2],p[3],p[4],p[5]); //顯示分 秒
p = strtok(NULL, ","); //得到有效性
if(*p == 'A') Uart_Printf("State: Data valid.n");
else Uart_Printf("State: Date no valid!!n");
p = strtok(NULL, ","); //得到緯度值
Uart_Printf("latitude(WGS-84): %s",p);
p = strtok(NULL,","); //北緯還是南緯
Uart_Printf("%sn",p);
p = strtok(NULL, ","); //得到經度值
Uart_Printf("longitude(WGS-84): %s",p);
p = strtok(NULL,","); //東經還是西經
Uart_Printf("%sn",p);
p = strtok(NULL,","); //速度
Uart_Printf("speed: %sn",p);
p = strtok(NULL,","); //方位
Uart_Printf("Direction: %sn",p);
p = strtok(NULL,","); //日期
Uart_Printf("Date: %c%c-%c%c-%c%cn",p[0],p[1],p[2],p[3],p[4],p[5]);
}
上一篇:對比stm32,arm9研究方向的猜想
下一篇:對于51單片機和arm9開發板串口通信問題的分析
推薦閱讀最新更新時間:2025-04-05 00:43



設計資源 培訓 開發板 精華推薦
- 使用 ON Semiconductor 的 FAN1537 的參考設計
- 使用 Analog Devices 的 LTC3803IS6-5 的參考設計
- 用于 12V 應用的 LTC4367CDD-1 過壓電源控制器的典型應用
- 使用 IXYS 的 CPC7581 的參考設計
- EVAL-AD7918CB,用于數據采集系統的 AD7918、10 位、1MSPS、8CH ADC 評估套件
- 使用 Semtech 的 SH3100 的參考設計
- btm334
- DC1998A,用于 LTC3892EUHF 雙路同步降壓控制器的演示板,6V = VIN = 60V,VOUT1 = 5V @ 8A,VOUT2 = 12V @ 5A
- tfemmc
- 使用 ROHM Semiconductor 的 BU4925 的參考設計
- 文遠知行采用BlackBerry QNX系統,打造極致安全的ADAS解決方案
- IAR攜手極海半導體,高效開發全球首款基于Cortex-M52的G32R501實時控制MCU
- 中國發布HDMI和DisplayPort替代方案:GPMI接口來了
- 三星進軍 AI 機器人領域,Ballie 本周公開亮相
- 消息稱美光即日起針對存儲模組產品向美國客戶征收“關稅附加費”
- 迅為IMX6ULL開發板交叉編譯器的安裝和使用
- 迅為-i.MX6ULL 開發板-移植OpenCv3.4.1-搭建編譯環境
- BOE(京東方)董事長提議回購公司股份 堅定看好資本市場長期價值
- 英飛凌宣布收購Marvell的汽車以太網業務
- 強強聯合!兆易創新與納微半導體達成戰略合作