久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5952|回復(fù): 0
收起左側(cè)

從串口獲得并分析GPS數(shù)據(jù)

[復(fù)制鏈接]
ID:127542 發(fā)表于 2016-6-21 17:20 | 顯示全部樓層 |閱讀模式
目前GPS(全球定位系統(tǒng))定位應(yīng)用市場(chǎng)日趨成熟,正在進(jìn)入應(yīng)用的高速發(fā)展時(shí)期。看到論壇里不斷有人提問(wèn)關(guān)于GPS的問(wèn)題。現(xiàn)將個(gè)人對(duì)GPS的了解寫出來(lái)跟大家一塊探討。
1、 GPS應(yīng)用簡(jiǎn)介
近年來(lái)GPS系統(tǒng),已經(jīng)在大地測(cè)繪、海上漁用、車輛定位監(jiān)控、建筑、農(nóng)業(yè)等各個(gè)領(lǐng)域得到廣泛應(yīng)用。從九十年代我國(guó)引進(jìn)GPS定位技術(shù)開(kāi)始,經(jīng)過(guò)十多年的市場(chǎng)培育,GPS定位應(yīng)用進(jìn)入了發(fā)展的最好時(shí)機(jī),未來(lái)十年基于GPS的應(yīng)用將會(huì)改變我們的生活和工作方式。
目前市場(chǎng)上的大部分GPS接受模塊都是通過(guò)RS232串口與MCU進(jìn)行數(shù)據(jù)傳輸?shù)摹_@些數(shù)據(jù)包括經(jīng)度、緯度、海拔高度、時(shí)間、衛(wèi)星使用情況等基本信息。開(kāi)發(fā)人員再依據(jù)這些基本數(shù)據(jù),進(jìn)行數(shù)據(jù)處理來(lái)完成整套的定位系統(tǒng)軟件。
2、 數(shù)據(jù)格式
在進(jìn)行數(shù)據(jù)接受編程之前,先介紹一下該模塊的數(shù)據(jù)格式。它支持NMEA-0183輸出格式。信息如下:
GGA位置測(cè)定系統(tǒng)定位資料(Global Positioning System Fix Data)
    GSV 導(dǎo)航衛(wèi)星資料(GNSS Satellites in View)
    RMC導(dǎo)航衛(wèi)星特定精簡(jiǎn)資料(Recommended Minimum Specific GNSS Data)
    VTG 方向及速度等相關(guān)資料(Course Over Ground and Ground Speed)
    由于文章篇幅問(wèn)題,筆者在這里只以接收GGA數(shù)據(jù)為例,格式如下:
    $GPGGA,hhmmss,dddmm.mmmm,a,dddmm.mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx*CS
    例:$GPGGA,033744,2446.5241,N,12100.1536,E,1,10,0.8,133.4,M,,,,*1F
說(shuō)明見(jiàn)表:



上面例子中,我們可讀出位置信息:北緯24度46.5241分,西經(jīng)121度00.1536分
                                格林威治時(shí)間:3點(diǎn)37分44秒

3   部分程序代碼(c++)
  1. //初始化串口
  2. //入口:strComm(串口名)
  3. //返回:TRUE(成功);FALSE(失敗)
  4. BOOL CGPSDlg::InitComm(CString strComm)
  5. {
  6.     int i;
  7.     DCB dcb;
  8.     COMMTIMEOUTS TimeOuts;

  9.     for (i=0; i<3; i++)                                         //串口最多初始化3次
  10.     {
  11.         m_hComm = CreateFile(strComm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  12.         if (m_hComm != INVALID_HANDLE_VALUE)
  13.             break;
  14.     }
  15.     if (i == 3)                                                 //串口初始化失敗
  16.     {
  17.         AfxMessageBox("串口初始化失敗...");
  18.         return FALSE;
  19.     }
  20.    
  21.     SetupComm(m_hComm, MAXLENGTH, MAXLENGTH);                   //設(shè)置發(fā)送接收緩沖區(qū)大小
  22.    
  23.     TimeOuts.ReadIntervalTimeout = 0;                           //設(shè)定5個(gè)超時(shí)參數(shù)
  24.     TimeOuts.ReadTotalTimeoutMultiplier = 0;
  25.     TimeOuts.ReadTotalTimeoutConstant = 500;
  26.     TimeOuts.WriteTotalTimeoutMultiplier = 0;
  27.     TimeOuts.WriteTotalTimeoutConstant = 500;
  28.     SetCommTimeouts(m_hComm, &TimeOuts);                        //設(shè)置超時(shí)參數(shù)
  29.    
  30.     GetCommState(m_hComm, &dcb);                                //獲得通信狀態(tài)
  31.     dcb.fAbortOnError = FALSE;                                  //有錯(cuò)誤不停止
  32.     dcb.BaudRate = CBR_4800;                                    //波特率4800
  33.     dcb.ByteSize = 8;                                           //8位
  34.     dcb.Parity = NOPARITY;                                      //奇校驗(yàn)
  35.     dcb.StopBits = ONESTOPBIT;                                  //1位停止位
  36.     SetCommState(m_hComm, &dcb);                                //設(shè)置通信狀態(tài)
  37.     PurgeComm(m_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR);            //清空發(fā)送和接收緩沖區(qū)   
  38.    
  39.     return TRUE;
  40. }

  41. //獲得GPS參數(shù)
  42. //注意:從GPS接收到的字符串已經(jīng)在m_strRecv中,由于是定時(shí)接收,所以在這個(gè)字符串的頭和尾都可能存在
  43. //     不完整的NMEA輸出字符串,在處理時(shí)要特別注意
  44. //返回:TRUE(格式正確);FALSE(格式錯(cuò)誤)
  45. BOOL CGPSDlg::GetGPSParam()
  46. {
  47.     int i,j;
  48.     CString str,strNEMA;
  49.         
  50.     //先判斷是否接收到數(shù)據(jù)
  51.     if (m_strRecv.IsEmpty())
  52.         return FALSE;

  53.     //若字符串不是以'

  54. [/color][i][/i]
  55. 開(kāi)頭的,必須刪掉這部分不完整的
  56.     if (m_strRecv[0] != '

  57. [/color][i][/i]
  58. )
  59.     {
  60.         i = m_strRecv.Find('\n', 0);
  61.         if (i == -1)
  62.             return FALSE;                                       //尾部未接收完整,必須等接收完后才能刪除
  63.         m_strRecv.Delete(0, i+1);                               //尾部已接收完整(尾部為\r\n結(jié)束),刪除不完整的部分
  64.     }
  65.    
  66.     //截取完整的NMEA-0183輸出語(yǔ)句(m_strRecv中可能有多條語(yǔ)句,每條間以\r\n分隔)
  67.     for (;;)
  68.     {
  69.         i = m_strRecv.Find('\n', 0);
  70.         if (i == -1)
  71.             break;                                              //所有的完整輸出語(yǔ)句都已經(jīng)處理完畢,退出循環(huán)
  72.         
  73.         //截取完整的NMEA-0183輸出語(yǔ)句
  74.         strNEMA = m_strRecv.Left(i+1);                          
  75.         m_strRecv.Delete(0, i+1);
  76.         //下面對(duì)各種輸出語(yǔ)句進(jìn)行分別處理
  77.         if (strNEMA.Find("$GPRMC",0) == 0)
  78.         {
  79.             //該輸出語(yǔ)句中的各項(xiàng)以','分隔
  80.             for (i=j=0; strNEMA[i]!='\r'; i++)                  //j為逗號(hào)的計(jì)數(shù)器
  81.             {
  82.                 if (strNEMA[i] == ',')
  83.                 {
  84.                     j++;
  85.                     str = "";
  86.                     for (i++; strNEMA[i]!=','&&strNEMA[i]!='\r'; i++)
  87.                         str += strNEMA[i];                      //str為某項(xiàng)的值
  88.                     i--;
  89.                     
  90.                     //對(duì)各項(xiàng)數(shù)據(jù)分別處理
  91.                     switch (j)
  92.                     {
  93.                     case 1:                                     //時(shí)間(UTC)                  
  94.                         m_strTime = str.Left(6);
  95.                         m_strTime.Insert(2, ':');
  96.                         m_strTime.Insert(5, ':');
  97.                         break;
  98.                     case 2:                                     //狀態(tài)(A-數(shù)據(jù)有效;V-數(shù)據(jù)無(wú)效,還未定位)
  99.                         if (str == "A")
  100.                             m_strStatus = "有效數(shù)據(jù)";
  101.                         else if(str == "V")
  102.                             m_strStatus = "正在定位...";
  103.                         else
  104.                             m_strStatus = "非法數(shù)據(jù)格式";
  105.                         break;
  106.                     case 3:                                     //緯度(ddmm.mmmm)
  107.                         str.Insert(2, "度");
  108.                         str += "分";
  109.                         m_strLatitude = str;
  110.                         break;
  111.                     case 4:                                     //緯度指示(N-北緯;S-南緯)
  112.                         if (str == "N")
  113.                             m_strLatitude.Insert(0, "北緯");
  114.                         else
  115.                             m_strLatitude.Insert(0, "南緯");
  116.                         break;
  117.                     case 5:                                     //經(jīng)度(dddmm.mmmm)
  118.                         str.Insert(3, "度");
  119.                         str += "分";
  120.                         m_strLongitude = str;
  121.                         break;
  122.                     case 6:                                     //經(jīng)度指示(E-東經(jīng);W-西經(jīng))
  123.                         if (str == "E")
  124.                             m_strLongitude.Insert(0, "東經(jīng)");
  125.                         else
  126.                             m_strLongitude.Insert(0, "西經(jīng)");
  127.                         break;
  128.                     case 7:                                     //速度(單位:節(jié))
  129.                         m_strSpeed = str;
  130.                         break;
  131.                     case 8:                                     //航向(單位:度)
  132.                         m_strCourse = str;
  133.                         break;
  134.                     case 9:                                     //日期(UTC)
  135.                         m_strDate = "";
  136.                         m_strDate += "20";
  137.                         m_strDate += str[4];
  138.                         m_strDate += str[5];
  139.                         m_strDate += "-";
  140.                         m_strDate += str[2];
  141.                         m_strDate += str[3];
  142.                         m_strDate += "-";
  143.                         m_strDate += str[0];
  144.                         m_strDate += str[1];
  145.                         break;
  146.                     default:
  147.                         break;
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.         else if (strNEMA.Find("$GPGGA",0) == 0)
  153.         {
  154.         
  155.         }
  156.         else if (strNEMA.Find("$GPGSA",0) == 0)
  157.         {
  158.         
  159.         }
  160.         else if (strNEMA.Find("$GPGSV",0) == 0)
  161.         {
  162.         
  163.         }
  164.         else if (strNEMA.Find("$GPGLL",0) == 0)
  165.         {
  166.         
  167.         }
  168.         else if (strNEMA.Find("$GPVTG",0) == 0)
  169.         {
  170.         
  171.         }
  172.         else
  173.             return FALSE;                                       //格式錯(cuò)誤
  174.     }
  175.     return TRUE;
  176. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久国| 国产一区不卡 | 精品久久香蕉国产线看观看亚洲 | 久久久激情 | 久久网一区二区三区 | 亚洲精品乱码久久久久v最新版 | 亚洲一av| 一区二区三区视频在线 | 91福利电影在线观看 | 日韩精品一区二区久久 | 国产成人艳妇aa视频在线 | 久久久久久久久久一区 | 亚洲精品视频在线看 | 色婷婷综合久久久中字幕精品久久 | 国内精品99 | av手机免费在线观看 | 精品一区二区久久久久久久网站 | 欧洲精品久久久久毛片完整版 | 午夜网站视频 | 欧美一级毛片在线播放 | 欧美一区二不卡视频 | 久久高清亚洲 | 国产专区免费 | 日韩视频一区 | 亚洲日韩中文字幕一区 | 国产一区高清 | 久久草在线视频 | 久久久精品在线 | 亚洲区在线 | 最新免费av网站 | 国产高清在线 | 一区二区三区国产 | 久久国产精品72免费观看 | 一级做a爰片久久毛片免费看 | 久久久久国产一区二区三区四区 | 超碰97av| 一级片av | 色黄视频在线 | 精品自拍视频 | 91精品久久 | 黄视频国产|