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

}

你可能感兴趣的:(c++)