MFC编写GPS程序.docx
- 文档编号:16970632
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:14
- 大小:334.86KB
MFC编写GPS程序.docx
《MFC编写GPS程序.docx》由会员分享,可在线阅读,更多相关《MFC编写GPS程序.docx(14页珍藏版)》请在冰点文库上搜索。
MFC编写GPS程序
4设计与实现
本系统定位为简单的GPS定位系统,具有GPS信息采集与处理的功能,能够为用户提供简单的定位信息。
为了进一步的开发,本系统连接了数据库并简单的加载了地图,这样就可以在此基础上来分析定位信息和建立详细的地图信息库。
4.1MFC的相关编辑
使用MFC框架建立基本的界面。
如下
图4.1系统界面
图4.2存储数据显示界面
添加MSComm控件。
利用类向导工具Classwizard建立新类、进行消息映射、修改类成员、为控件在所属对话框类中映射控件对象,通过控件对象调用控件类的方法,可以方便的对控件对象进行操作。
4.3参数设置一
4.4参数设置二
4.2串口初始化
设置串口的基本属性:
串口打开、接收缓冲区打小、串行端口号、发送缓冲区大小、Setting属性、接收缓冲区触发OnComm事件的阀值。
图4.5初始化成功
消息框显示初始化成功。
4.3OnComm函数
4.3.1数据接收
接受原始信息,转换格式后完全显示。
图4.6原始信息的接受
4.3.2数据的基础处理
根据NEMA协议从GPGGA字段和GPRMC中提取所需的信息,这里提取了时间、海拔、所用到的卫星数、经纬度信息、速度、信息有效性等信息。
for(i=0;i<200;i++){
if(data[i]=='$'&&data[i+1]=='G'&&data[i+2]=='P'
&&data[i+3]=='G'&&data[i+4]=='G'){
IDD=0;
}
if(data[i]==',')
IDD++;
else{
switch(IDD){
case6:
str.Format("%c",data[i]);
if(str=='0')
m_dingweib="否";
if(str=='1')
m_dingweib="非差分定位";
if(str=='2')
m_dingweib="差分定位";
if(str=='3')
m_dingweib="无效PPS";
if(str=='6')
m_dingweib="正在估算";
case7:
str.Format("%c",data[i+1]);
if(str==','){
str.Format("%c",data[i]);
m_geshu=str;
}
else{
str.Format("%c%c",data[i],data[i+1]);
m_geshu=str;
}
break;
case9:
str.Format("%c%c%c%c%c",data[i],data[i+1],data[i+2],data[i+3],data[i+4]);
m_hight=str;
default:
break;
}
}
}UpdateData(FALSE);
GPGGA的提取(加图)提取GPGGA信息类型、使用的卫星个数、海拔
图4.7GPGGA信息的显示
for(i=0;i<200;i++){
if(data[i]=='$'&&data[i+1]=='G'&&data[i+2]=='P'
&&data[i+3]=='R'){
ID=0;//MessageBox("帧开始");
}
if(data[i]==',')//提取信息
ID++;
else{
switch(ID){
case1:
//MessageBox("提时间取信息");
str.Format("%c%c",data[i],data[i+1]);
m_hour=(atoi(str)+8)%24;//小时
str.Format("%c%c",data[i+2],data[i+3]);
m_min=atoi(str);//分钟
str.Format("%c%c",data[i+4],data[i+5]);
m_sec=atoi(str);//秒
break;
case2:
//MessageBox("接收有效性信息");
str.Format("%c",data[i]);
if(str=='A')
m_dingwei="是";
if(str=='V')
m_dingwei="否";
break;
case3:
str.Format("%c%c",data[i],data[i+1]);
m_weidu=str;//维度度
str.Format("%c%c",data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7],data[i+8]);
m_weiduf=atof(str);//分
case4:
str.Format("%c",data[i]);
m_wei=str;//南北纬
case5:
//MessageBox("提取经度信息");
str.Format("%c",data[i+10]);
if(str==','){
str.Format("%c%c",data[0],data[1]);
m_jingdu=str;//经度度
str.Format("%c%c%c",data[2],data[3],data[4],data[5],data[6],data[7],data[8],data[9]);
m_jingduf=atof(str);//分
}
else{
str.Format("%c%c%c",data[0],data[1],data[2]);
m_jingdu=str;//经度度
str.Format("%c%c%c",data[3],data[4],data[5],data[6],data[7],data[8],data[9]);
m_jingduf=atof(str);//分
}
break;
case6:
str.Format("%c",data[i]);
m_jing=str;//东西经
case7:
str.Format("%c%c%c%c%c",data[i],data[i+1],data[i+2],data[i+3],data[i+4]);
m_jing=str;//速度
default:
break;
}
}
}UpdateData(FALSE);
GPRMC信息的提取(加图)提取GPRMC信息有效性、经纬度信息、速度、时间、日期
图4.8GPRMC的显示
4.4数据库
4.4.1数据库的连接
虽然直接应用ODBCAPI编制应用程序相对来说较为繁琐,但由于直接使用ODBCAPI编写的程序相对要简洁、高效。
在使用ODBCAPI时,用户必须引入的头文件为sql.h,sqlext.h,sqltypes.h。
(1)首先要分配ODBC环境
首先程序中声明一个SQLHENV类型的变量,然后调用函数SQLAllocHandle,向其中传递分配的上述SQLHENV类型的变量地址和SQL_HAndLE_ENV选项。
代码如下:
SQLHENVhenv;
SQLAllHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
(2)分配连接句柄
分配环境句柄后,在建立至数据源的连接之前,我们必须分配一个连接句柄,每一个到数据源的连接对应于一个连接句柄。
首先,程序定义了一个SQLHDBC类型的变量,用于存放连接句柄,然后调用SQLAllocHandle函数分配句柄。
代码如下:
SQLHDBChdbc;
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
(3)设置数据源
首先设置连接属性,所有连接属性都有省缺值,也可以通过调用函数SQLSetConnectAttr()来设置。
用函数SQLGetConnectAttr()获取这些连接属性。
然后建立到数据库的连接,这里采用SQLConnect函数。
SQLConnect提供了最为直接的程序控制方式,我们只要提供数据源名称、用户ID和口令,就可以了。
代码如下:
SQLRETURNSQLConnect(SQLHDBCConnectionHandle,SQLCHARServerName,SQLSMALLINTNameLength1,SQLCHARUSERNAME,SQLSMALLINTNameLength2,SQLCHAR,SQLSMALLINTNAMELENGTH3);
(4)SQL操作
应用程序的绝大部分数据库访问工作都是通过执行SQL语句完成的,在执行SQL语句之前,必须要先分配一个语句句柄,然后设置相应语句的语句属性,再执行SQL语句。
当一个语句句柄使用完成后,调用函数SQLFreeHandle()释放该句柄。
SQLExecute()用于执行一个准备好的SQL语句,当语句中有参数时,用当前的参数变量的值。
使用参数可以使用使一条SQL语句多次执行,得到不同的结果。
函数SQLBindParameter负责为参数定义变量,实现参数值的传递。
(5)断开同数据源的连接
当完成对数据库的操作后,就可以调用SQLDisconnect函数关闭连接。
(6)释放ODBC环境
最后一步就是记得释放ODBC环境参数。
本部分的程序代码如下:
SQLHENVhenv;
SQLHDBChdbc;
SQLHSTMThstmt;
SQLRETURNretcode;
retcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){
retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){
retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){
SQLSetConnectAttr(hdbc,(void*)SQL_LOGIN_TIMEOUT,5,0);
retcode=SQLConnect(hdbc,(SQLCHAR*)"mydb",SQL_NTS,(SQLCHAR*)"root",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);
if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){
retcode=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO){
SQLExecDirect(hstmt,"insertintoginfo(gno,data,time,jingdu,jingdub,weidu,weidub,hight,speed,count)values(,t_data,t_time,t_jingdu,t_jingdub,t_weidu,t_weidub,t_hight,t_speed,t_count)");
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);}
SQLDisconnect(hdbc);}
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);}}
SQLFreeHandle(SQL_HANDLE_ENV,henv);
数据库的存储显示:
图4.9所存数据的显示
4.4.2数据库表的设计
建表createdatabaseGPSinfo;
Createtableginfo(gnointegerautoincreate,datatimevarchar(20),jingduvarchar(20),jingdubvarchar(20),weiduvarchar(20),weidubvarchar(20),hightvarchar(20),speedvarchar(20),countvarchar(20))
表4.1所提取信息
序号
字段名称
字段类型
字段意义
允许空
1
gno
integer
信息号
否(主键)自动加1
2
data
Varchar(20)
日期
是
3
time
Varchar(20)
时间
是
4
jingdu
Varchar(20)
经度
是
5
jingdub
Varchar(20)
东西经
是
6
weidu
Varchar(20)
维度
是
7
weidub
Varchar(20)
南北纬
是
8
hight
Varchar(20)
海拔
是
9
speed
Varchar(20)
速度
是
10
count
Varchar(20)
卫星数
是
主要的操作Sql语句:
Insertintoginfo(infono,datatime,jingdu,jingdub,weidu,weidub,hight,speed,count)values(,m_datetime,m_jingdu,m_jingdub,m_weidu,weidub,m_hight,m_speed,m_count)
4.5加载Mapinfo地图
导航载体在
电子地图上显示及运动的主要代码如下(newsbl、
Oldsb定义为CmapFeature类对象,step定义为int
型变量,均为全局变量):
Voidcnavdialog:
:
navistream()
{
Cmpxlayer;
))以下对有关图层和导航载体运动符号
进行设置
---
Anlay=m-ctrlmapx.getlayers().item(“navmap”);
Anlay.getstyle().setSymbolbitmapsize(12);
Newsbl.attach(m-ctrlmapx.getdispath());
Newsbl.setstyle(m-ctrlMapx.getdafaultstyle());
在图上显示载体运动,其中longitude、
latitude以度为单位
nawsbl.getpoint().set(longitude,latitude);
if(step!
=0)
anlay.deletefeature(oldsbl);
step++;
oldsbl=anlay.addfeature(newsbl);
---
m-ctrlmapx.refresh();
updatedata(false);
updatewindow();
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 编写 GPS 程序