1. 程式人生 > >GPS資訊中提取經緯度座標資訊

GPS資訊中提取經緯度座標資訊

1 、NMEA0183通訊協議
NMEA0183是GPS資料的通訊協議,GPS的通訊協議有很多種,但目前絕大多數GPS模組生產廠商都採用NMEA0183協議作為其遵循的標準。
(1)NMEA0183的通訊引數.波特率:4800baud;資料位:8;奇偶校驗:無;停止位:1位.
(2)NMEA0183的報文格式.NMEA 0183協議報文的語句串(ASCII字元)格式全部資訊.
詳情參考:
NMEA0183通訊協議詳細解釋或者《visual C++程式設計例項寶典》第29章GPS定位系統
2、GPS 串列埠初始化
串列埠初始化程式主要定義波特率等引數
在MFC程式中,在OnInitDialog()函式中初始化串列埠.
對串列埠的操作, 用mscomm控制元件完成

mscomm控制元件註冊
控制元件使用

//初始化
void OnInitCOMInf()
{
if (!m_mscom.get_PortOpen())     //初始化串列埠
    {
        m_mscom.put_CommPort(4); //選擇串列埠
        m_mscom.put_InputMode(1);     //設定輸入方式為二進位制方式
        m_mscom.put_Settings(_T("9600"));   //波特率為(波特率組A合框)無校驗,8資料位,1個停止位
        m_mscom.put_InputLen(1024);   //設定當前接收區資料長度為1024
m_mscom.put_RThreshold(1); //緩衝區一個字元引發事件 m_mscom.put_RTSEnable(1); //設定RT允許 m_mscom.put_PortOpen(true); //開啟串列埠 } }

3、NMEA0183通訊協議下,GPS經緯度和高度資訊的提取
此步驟是對字串的處理。在共用體GPSPack中,定義了協議解析有關的額結構變數,如:結構體tagBODY_NEMA_TEXT中儲存有NEMA文字格式的協議資料項,經度座標、緯度座標、三維速度等。開發中常用這些資訊。作者僅僅為了方便使用,在科研中學習,所以用了對字串的操作來接受和提取資訊。

CString  m_longitude;//經度
CString  m_latitude;//緯度
CString  m_altitude;//海拔高度
/*...............串列埠響應函式..............*/
BEGIN_EVENTSINK_MAP(CKilometerPostDlg, CDialog)
ON_EVENT(CKilometerPostDlg, IDC_MSCOMM1, 1, CKilometerPostDlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()
void CKilometerPostDlg::OnCommMscomm1()
{
    // TODO:  在此處新增訊息處理程式程式碼
    //判斷是否有資料接受
    if (m_mscom.get_CommEvent() == 2)
    {
        int nIndex = 0;
        int nTokenPos = 0;

        char str[1024] = { 0 };            
        long k;
        VARIANT InputData = m_mscom.get_Input(); //讀緩衝區
        COleSafeArray fs;
        fs = InputData; //VARIANT型變數轉換為COleSafeArray型變數
        for (k = 0; k < fs.GetOneDimSize(); k++)
            fs.GetElement(&k, str + k); //轉換為BYTE型陣列

        m_strlineBuffer += str;
        CString strToken = m_strlineBuffer.Tokenize(_T(","), nTokenPos);//以逗號作為分隔符
        while (!strToken.IsEmpty())
        {
            if (0 == nIndex && strToken != _T("$GPGGA")) break; //不是需要的行

            if (2 == nIndex)
            {
                m_latitude = strToken;
                m_latitude = m_latitude.Left(7);
                m_strlineBuffer += CString(_T("\n "));

                //更新介面
            //  UpdateData(FALSE);
                //break;
            }

            if (4 == nIndex)
            {
                m_longitude = strToken;
                m_longitude = m_longitude.Left(7);//取字串的前7個字元
                m_strlineBuffer += CString(_T("\n "));

                //更新介面
            //  UpdateData(FALSE);
                //break;
            }
            if (9 == nIndex)
            {
                m_altitude = strToken;
                m_strlineBuffer += CString(_T("\n "));

                //更新介面
            //  UpdateData(FALSE);
                break;
            }
            strToken = m_strlineBuffer.Tokenize(_T(","), nTokenPos);
            ++nIndex;
        }
        //清零一行資料,以便重新記錄
        m_strlineBuffer = "";
        //UpdateData(false);
    }

}