GPS应用

GPS是智能手机必备的功能之一,在程序中加入LBS服务器无疑会具有巨大的商业价值。
本文就对个平台下PGS简单操作作个简单的总结
  1 /*************************************
  2 //转载请保留作者信息
  3 // author:   sylar xiong jian
  4 // QQ:67666938 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 }
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、付费专栏及课程。

余额充值