一、相關概念
1.GPS(Global Positioning System):全球衛星定位系統
美國的24顆衛星不停地給地面發GPS信號,只要有一台GPS接收設備,就能定位出你所在的位置高度和速度了,它與電子地圖的結合就是通常所說的GPS功能
二、連接方式
1.串口:計算機通常通過串口讀取gps數據(藍牙的gps也使用虛擬串口)
2.步驟:
1)普通串口設備
打開串口->設置串口->讀取數據->恢復串口->關閉串口
2)藍牙設備
開啟藍牙->與gps設備連接->打開串口->讀取數據->關閉串口->與gps設備斷開->關閉藍牙
3)注意
連接gps藍牙設備如需要連接密碼,設置為0000(藍牙默認密碼)
用藍牙gps設備一般不用對串口進行設置
三、gps數據格式
1.從串口中讀出的是文本數據,每次讀出一行,一般情況下,一秒種能收到多行數據
2.有效數據以$GP開頭,分為$GPGGA、$GPGSA、$GPGSV、$GPRMC…
3. $GPGGA 是GPS定位的主要數據,通過解析它得到經度、緯度、海拔高度、時間、衛星使用情況等基本信息,其中每項用逗號分隔,共十四個逗號,舉例如下:
$GPGGA,064746.000,4925.4895,N,00103.9255,E,1,05,2.1,-68.0,M,47.1,M,,0000*4F
$GPGGA(語句標識頭),064746.000(UTC時間),4925.4895(緯度),N(緯度半球),00103.9255(經度),E(經度半球),1(定位質量指示),05(使用衛星數量),2.1(水平精確度),-68.0(海拔高度),M(高度單位),47.1(大地水准面高度),M(高度單位),(差分 GPS數據期限),0000(差分參考基站標號)*4F(校驗)(結束標記回車換行)
四、例程
1.功能描述
假設藍牙模塊與gps已連接成功,藍牙的虛擬串口設備是ttyB2
實現從藍牙設備連接讀取100條數據,解析後(經度/緯度/海拔/衛星個數)顯示出來
2.代碼
#include
#include
#include
#include
#include
#include
void parseData(char *buf)
{
int ret, nQ, nN, nB, nC;
char cX, cY, cM1, cM2;
float fTime, fX, fY, fP, fH, fB, fD;
if (buf == NULL)
return;
ret = sscanf(buf,
"$GPGGA,%f,%f,%c,%f,%c,%d,%02d,%f,%f,%c,%f,%c,%f,%04d%02x",
&fTime, &fX, &cX, &fY, &cY, &nQ, &nN, &fP, &fH, &cM1, &fB,
&cM2, &fD, &nB, &nC);
printf("x: %c %f, y: %c %f, h %f, satellite: %d\n",
cX, fX, cY, fY, fH, nN);
}
int main(int argc, char **argv)
{
int fd, i, ret;
char buf[1024] =
"$GPGGA,064746.000,4925.4895,N,00103.99255,E,1,05,2.1,-68.0,M,47.1,M,,0000*4F\r\n"; // 此處賦值用於測試
if ((fd = open("/dev/ttyB2", O_RDWR)) == -1)
return -1;
// set fd: tcsetattr... 直接連接串口的設備需要在此設置波特率
for (i = 0; i < 100; i++)
{
ret = read(fd, buf, 1024);
if (ret > 1)
{
if (strstr(buf, "GPGGA") != NULL)
parseData(buf);
}
}
// restore fd: tcsetattr... 直接連接串口的設備需要在此恢復波特率
close(fd);
}