各种平台GPS编程 总结

 
  
GPS是智能手机必备的功能之一,在程序中加入LBS服务器无疑会具有巨大的商业价值。
本文就对个平台下PGS简单操作作个简单的总结
1 /* ************************************
2 //转载请保留作者信息
3 // author: sylar xiong jian
4 // cug@live.cn
5 // data: 2010.4.21 PM 22:01:32
6 //1 windows mobile
7 //
8 ************************************** */
9   // 很简单的代码,就不用说明什么了。
10   HANDLE m_GpsMudle;
11 DCB m_GpsDCB;
12
13 /* **************** 首先是初始化***************** */
14 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
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 }

 

有点累,而且代码还不能确定,所以android和iphone平台的GPS操作,我会下回补上的。

转载于:https://www.cnblogs.com/SuperXJ/archive/2010/04/22/1717796.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值