GPS

  
  
GPS是智能手机必备的功能之一,在程序中加入LBS服务器无疑会具有巨大的商业价值
本文就对个平台下PGS简单操作作个简单的总结

很简单的代码,就不用说明什么了。

[code]
HANDLE m_GpsMudle;
DCB m_GpsDCB;

/*
**************** 首先是初始化*****************
*/

m_GpsMudle = CreateFile(
"
COM1
"
,GENERIC_READ
|
GENERIC_WRITE,
0
,NULL,OPEN_EXISTING,
0
,NULL );
//
打开串口



15
SetCommMask( m_GpsMudle, EV_RXCHAR
|
EV_BREAK
|
EV_ERR );


16
m_GpsDCB.DCBlength
=

sizeof
( DCB );


17
GetCommState( m_GpsMudle,
&
m_GpsDCB );
//
获得串口状态



18
m_GpsDCB.BaudRate
=

4800
;
//
波特率



19
m_GpsDCB.ByteSize
=

8
;


20
m_GpsDCB.Parity
=
NOPARITY;


21
m_GpsDCB.StopBits
=
ONESTOPBIT;


22



23

//
sleep to let dcb be effect



24
Sleep(
1000
);


25
SetCommState( m_GpsMudle,
&
m_GpsDCB );
//
设置串口通讯信息



26
GetCommTimeouts(m_GpsMudle,
&
timeouts);


27
timeouts.ReadTotalTimeoutConstant
=

1000
;


28
timeouts.ReadTotalTimeoutMultiplier
=

0
;


29
timeouts.ReadIntervalTimeout
=

1
;


30
SetCommTimeouts(m_GpsMudle,
&
timeouts);
//
设置读取数据超时时间



31
PurgeComm(m_GpsMudle,PURGE_TXCLEAR
|
PURGE_RXCLEAR);
//
清理缓存



32



33
/*
**************** 设置一个线程开始读取GPS数据 *****************
*/



34
SetCommMask( m_GpsMudle,EV_RXCHAR
|
EV_CTS
|
EV_DSR
|
EV_RING);


35
while
(
1
)


36
{


37
ReadFile( g_GpsModule.GetSafeHandle(),
&
bbyte,
1
,
&
dwBytesTransferred,
0
);


38

if
(bbyte
=

'
$
'
)
//
表示有效的GPS信息,具体看GPS的格式,这里不说了。



39
{


40
}


41
}


42
[/code]


43
/*
************************************


44
// 转载请保留作者信息


45
// author: sylar xiong jian


46
// QQ:67666938 cug@live.cn


47
// data: 2010.4.21 PM 22:20 after a shower!


48
//2 Symbian OS 5TH S60


49
// refer:
http://www.newlc.com/en/playing-n95?page=2



50
// 无错误处理和析构


51
**************************************
*/



52
//
首先解释下 symbian 的活动对象概念,非常类似于ACE和其他服务器模型,也类似于windows消息传递机制,所以非常简单。


53
//
ActiveObjec symbian 里的活动对象类似于windows里的窗口,是接收消息的基本单元。所有的ActiveObject在创建后会通过CActiveScheduler::Add 把自己加入到Scheduler里面。每个ActiveObjec里有一个iStatus标识,类似于windows里面的窗口句柄。


54
//
Scheduler 是一个独立线程的调度器,也就是主线程和ActiveObjec在一个线程,而调度器Scheduler单独为一个线程,Scheduler阻塞一直到有事件到来,然后根据iStatus标识调用相对于的活动对象ActiveObjec的RunL函数。



       
       
#include <lbsposition.h>

#include <lbssatellite.h>






55
 

#include <lbsposition.h>



RPositionServer iPosServer;
//
表示定位服务器


#include <lbssatellite.h>  






56
RPositioner iPositioner;
//
会话



57
void
CCActivePositioner::ConstructL(CFirstGpsAppView
*
aView)


58
{


59
iView
=
aView;


60



61

//
Connect to the position server



62
TInt error
=
iPosServer.Connect( );
//
连接到定位服务器


63



64

//
Open subsession to the position server



65
error
=
iPositioner.Open(iPosServer);
//
获得和定位服务器的会话


66



67

//
Set position requestor 告诉LBS谁需要位置服务



68
error
=
iPositioner.SetRequestor( CRequestor::ERequestorService,CRequestor::EFormatApplication , KRequestor );


69



70

//
Set update interval to one second to receive one position data per second



71
TPositionUpdateOptions upOpt;


72
upOpt.SetUpdateInterval(TTimeIntervalMicroSeconds(
1000000
));
//
GPS位置下载时间间隔 1秒



73
upOpt.SetUpdateTimeOut(TTimeIntervalMicroSeconds(
1000000

*

15
));
//
超时时间 15s



74
upOpt.SetMaxUpdateAge(TTimeIntervalMicroSeconds(KMaxAge));


75



76

//
Set update options



77
error
=
iPositioner.SetUpdateOptions( upOpt );
//
应用上面的设置,每1秒下载一次GPS位置信息


78



79

//
Request first position NotifyPositionUpdate



80
iPositioner.NotifyPositionUpdate(iPositionInfo,iStatus);
//
开始异步的获取位置信息..


81

//
Set this object active



82
SetActive();


83
}


84



85



86
void
CCActivePositioner::RunL()


87
{


88

switch
(iStatus.Int())


89
{


90

//
The fix is valid



91

case
KErrNone:


92

case
KPositionPartialUpdate:
//
异步的获得了GPS信息
//
如果有GPS信号了则进入这里运行,触发条件就是上面的 iPositioner.NotifyPositionUpdate(iPositionInfo,iStatus);



93
{


94
com_pool_data_t
*
sent
=
NULL;


95
TUint8 sent_num, i
=

0
;


96
TBuf8
<
COM_BUFFER_ITEM_SIZE
>
sent_data;


97

//
get the NMEASentences and add into the list



98
iPositionGeneInfo
->
GetValue(EPositionFieldNMEASentences, sent_num);
//


99

for
(i
=

0
; i
<
sent_num; i
++
)


100
{


101
sent
=
comm_alloc_data(
&
com_pool_head);


102

if
(sent
==
NULL){


103
comm_free_all_data(
&
com_pool_head,
&
g_gps_data_head);


104
sent
=
comm_alloc_data(
&
com_pool_head);


105
}


106
iPositionGeneInfo
->
GetValue(EPositionFieldNMEASentencesStart
+
i, sent_data);


107
memcpy(sent
->
data, sent_data.Ptr(), sent_data.Length());


108
list_add_before(
&
sent
->
list_node,
&
g_gps_data_head);
//
g_gps_data_head是一个linux链表,将sent的内容插入到这个链表中



109
}


110

break
;


111
}


112

default
:


113

break
;


114
}


115
//
再次请求GPS信息,这样就形成了一个循环。每1秒请求一次GPS信息



116
iPositioner.NotifyPositionUpdate(
*
iPositionGeneInfo, iStatus);


117
SetActive();


118
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPS应用程序设计》源代码。本软件是专为《GPS应用程序设计》一书配套发行的。包括: 1、 data_log.c 数据采集程序 2、 rinexout.c RINEX数据格式写入子程序 3、 to_rinex.c 数据格式转换 4、 sav_pos.c 卫星位置计算程序 5、 sky_sav.c 卫星天空显示程序 6、 dop_calc.c 卫星星座DOP计算程序 7、 view_sav.c 历书预报卫星出现程序 8、 absl_pos.c 单点绝对定位程序 9、 ssgsoft.c -- 相对静态定位主程序 10、 controlf.c ? 读取输入文件子程序 11、 orbit.c -- 选择参考卫星子程序 12、 broad.c -- 读广播星历计算子程序 13、 igs.c -- 读 IGS 精密星历子程序 14、 singlep.c -- 近似位置计算子程序 15、 rinex.c -- 读 Rinex 数据、探测跳周、组成单差子程序 16、 eqdd_s.c -- 组成双差方程子程序 17、 normdd_s.c ? 组成法方差子程序 18、 ad_core.c -- 平差子程序19、 ambifix.c -- 模糊度固定子程序 20、 tranf.c -- 坐标变换子程序 21、 dgps_ppr. 相位平滑伪距改正数计算程序 22、 dgps_phr 准载波相位改正数计算程序 23 rtcmencd.c RTCM 电文编码程序 24 rtcmencd.c RTCM 电文译码程序 25、 net_dgn.c 测量格网设计程序 26 sur_ctr.c 动态测量控制程序 27、 replay.c 动态测量数据回放程序 28、 kin_tran.c 动态定位坐标转换程序 29、 rms.c 定位精度估计程序 30、 tide.c 潮位改正程序 31、 xybl_54.c 54坐标变换程序 32、 xyxy_loc.c 任意坐标系转换程序 33、 gga+gsv.c GGA和GSV数据模拟程序 34、 depth.c 水深数据模拟程序 35、 gg_pos.c GPS+GLONASS导航程序 36、 menu1.c DOS环境换页式菜单程序 37、 menu2.c DOS环境下拉式菜单程序 38、 menu3.c windows95环境下拉式多层界面菜单程序 39、 makedata.c 利用RINEX格式文件data.98n和data.98o形成的data.out文件,供计算单点定位用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值