在桌面程序中添加GPS功能

程序下载


介绍:
GPS标准用于全球定位系统并且用于发现相关地理位置信息(如经纬度),另外其它一些信息如时间,罗盘信息,速度也能从GPS获得。
GPS设备使用卫星(至少3个或最多14个)来找到在地球上某个位置。最先进的GPS设备支持一种叫NMEA0183的协议。该协议用来将位置信息传输到电脑或PDA。
连接PC到GPS:
为了从GPS发送信息到你的电脑,你需要一些线缆连接到GPS,然后你必须配置你的端口以便通信正常。在该项目中,我配置了我的端口如下:
COM Port: COM2
Baud Rate: 4800
Data Bits: 8
Parity: No Parity
Stop Bits: 2


你必须按照GPS的手册将你的端口配置正确。
NMEA0183:
我在刚才提到过,NMEA0183是一个协议标准用来传输位置信息从GPS到你的PC。我使用了一个共享库并不做任何修改的添加到你的项目中。
你可以在下载文件中找到该库。感谢Sam Blackburn提供了该库。该协议由若干语句组成,每个句子由$做开始。例如以下句子:
"$GPGGA,104435.12,3337.19,N,11158.43,W,1,06,4.5,,,,,,"

表示的是如下信息(就是翻译后的结果)
Time: 10:44:35 AM UTC
Latitude: 33 37.19 North
Longitude: 111 58.43 West
Number of satellites: 6

 

只用该库:
首先,你必须田加nmea0183.lib到你的项目中。出于这个原因,选择项目,设置连接标签。在Object/Library模块中输入nmea0183.lib的路径(例如: ./NMEA0183/Debug/NMEA0183.lib)。
然后点OK返回项目。
如果你在项目中使用了对话框,添加"NMEA0183.h"到你的对话框的头文件中。通常"NMEA0183.h"被添加到主文件的头文件中。
现在,增加一个成员变量nmea0183,变量类型为NMEA0183,如下:
NMEA0183 nmea0183;
然后,必须添加头和执行文件以便进行通信。我从Shibu K.V的”A simple Class for Implementing Serial Communication in Win-9X/2000“文章中用了CSerialCom类。
添加一个成员变量Serial类型是CSerialCom,如下:
CSerialCom Serial;
现在必须配置你的串口:

//打开串口:COM2
Serial.OpenPort("COM2");


//配置COM2
Serial.ConfigurePort(4800,          //Baud Rate
                     8,             //Data Bits
                     FALSE,         //Has Parity
                     NOPARITY,      //Parity Bits
                     TWOSTOPBITS    //Stop Bits
                    );


//读取GPS数据   
char Data[100]="/0";

BYTE DataByte='/0';
int nIndex=0;


//获得GPS的信息
//注意:NMEA0183语句必须用"/r/n"结束
BOOL Return=Serial.ReadByte(DataByte);
while (DataByte!='/r' && DataByte!='/n' && Return==TRUE)
{
    Data[nIndex]=DataByte;
    nIndex++;
    Return=Serial.ReadByte(DataByte);
}
   
Data[nIndex++]='/r';
Data[nIndex++]='/n';
Data[nIndex++]='/0';


//清除没用字符然后退出
nIndex=0;
while (Data[nIndex]!='$' && nIndex<100)
    nIndex++;


现在,是用nmea0183成员变量开始工作的时候了。NMEA0183类有两个非常重要的成员函数和一个成员变量是:
AddTail() 添加从GPS获得的字符串
Parse() 分析获得的字符串。用PlainText保存翻译好的字符内容。
解决:
用一个线程在对话框项目中,用来和GPS进行通信,并在一个文本中显示位置信息。我的线程函数如下:
 CollapseUINT MyThread(LPVOID pParam)
{
    CSerialCom Serial;
    NMEA0183 nmea0183;
    CStringList StrList;

    if (!Serial.OpenPort("COM2"))
    {   
        AfxMessageBox("Can't Open Port!");
        return 0;
    }
   
    Serial.ConfigurePort(4800, 8, FALSE, NOPARITY, TWOSTOPBITS);
   
   
    //从GPS读取数据
    char Data[100]="/0";
   
    BYTE DataByte='/0';
    int nIndex=0;
   
    BOOL Return=Serial.ReadByte(DataByte);
    while (DataByte!='/r' && DataByte!='/n' && Return==TRUE)
    {
        Data[nIndex]=DataByte;
        nIndex++;
        Return=Serial.ReadByte(DataByte);
    }
   
    Data[nIndex++]='/r';
    Data[nIndex++]='/n';
    Data[nIndex++]='/0';
   
  
    //移除没用的字符
    nIndex=0;
    while (Data[nIndex]!='$' && nIndex<100)
        nIndex++;
   
    StrList.RemoveAll();
    StrList.AddTail(Data+nIndex);
   
    
    //翻译字符串
    POSITION position = StrList.GetHeadPosition();
   
    while(position!=NULL)
    {
        nmea0183 << StrList.GetNext(position);
       
        if (!nmea0183.Parse())
            AfxMessageBox("Can't parse!");
        else
        {   
            if (nmea0183.PlainText.GetLength()!= 0)
            {
                CString sMsg;
                sMsg.Format("%s",(const char *) nmea0183.PlainText);
                AfxMessageBox(sMsg);
            }
        }
    }
    Serial.ClosePort();
   
    return 0;
}

当你想要显示GPS信息时,调用该线程如下:
AfxBeginThread(MyThread,NULL);
连接NMEA0183库:
我们能用两种方式连接NMEA0183库:静态和动态。在这两种方式中,你必须选择恰当的开关以便编译时调用。如果你希望程序在MFC中静态连接该库,NMEA0183会被静态连接。如果你希望动态连接,可以编译为动态的。
未来发展趋势:
想了解更多关于NMEA0183协议的内容访问NMEA.org 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值