GPS

来源:互联网 发布:淘宝助理不能一键适配 编辑:程序博客网 时间:2024/06/09 14:22
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
}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 半夜两三点饿了怎么办 科目三预约不上怎么办 心脏支架又堵了怎么办 车辆验车过期了怎么办 车辆年审过期2天怎么办 违停单子丢了怎么办 沙发弹簧包坏了怎么办 bt种子被和谐了怎么办 苹果手机id密码忘了怎么办 墙漆颜色太深了怎么办 油漆颜色太深了怎么办 墙面漆颜色太深怎么办 古代打仗牙掉了怎么办 乐视电视没声音怎么办 老公疑心病很重怎么办啊 被安装了尿道锁怎么办 狼青小狗腿罗圈怎么办 备孕期间有霉菌怎么办 虫子进皮肤里了怎么办 生完孩子肚子越来越大怎么办 怀孕8个月肚子小怎么办 孕晚期胎儿不长怎么办 肚子上肉特别多怎么办 奶堵了有硬块怎么办 便秘5天肚子胀怎么办 上火大便拉不出来怎么办 大便拉不出来肚子痛怎么办 戒奶奶涨有硬块怎么办 忌奶的时候涨奶怎么办 娃儿隔奶,,奶涨怎么办 狗肚子很大很鼓怎么办 注册不了的二建怎么办 专升本没考过怎么办 警察乱拘留人该怎么办 玩英雄联盟太卡怎么办 一方离婚证丢了怎么办 遭遇呼死你软件怎么办 开车遇见碰瓷的怎么办 遇到碰瓷老人的怎么办 睿强遥控锁坏了怎么办 地暖分水器坏了怎么办