歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux串口讀取GPS數據

Linux串口讀取GPS數據

日期:2017/2/28 16:25:13   编辑:Linux教程

‍一、相關概念

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);

}

Copyright © Linux教程網 All Rights Reserved