各种平台GPS编程 总结
2010-04-22 09:35
344 查看
GPS是智能手机必备的功能之一,在程序中加入LBS服务器无疑会具有巨大的商业价值。本文就对个平台下PGS简单操作作个简单的总结 /************************************* //转载请保留作者信息 // author: sylar xiong jian // cug@live.cn // data: 2010.4.21 PM 22:01:32 //1 windows mobile // ***************************************/ //很简单的代码,就不用说明什么了。 HANDLE m_GpsMudle; DCB m_GpsDCB; /***************** 首先是初始化******************/ m_GpsMudle = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL ); //打开串口 SetCommMask( m_GpsMudle, EV_RXCHAR|EV_BREAK|EV_ERR ); m_GpsDCB.DCBlength = sizeof( DCB ); GetCommState( m_GpsMudle, &m_GpsDCB ); //获得串口状态 m_GpsDCB.BaudRate = 4800; //波特率 m_GpsDCB.ByteSize = 8; m_GpsDCB.Parity = NOPARITY; m_GpsDCB.StopBits = ONESTOPBIT; //sleep to let dcb be effect Sleep(1000); SetCommState( m_GpsMudle, &m_GpsDCB );//设置串口通讯信息 GetCommTimeouts(m_GpsMudle, &timeouts); timeouts.ReadTotalTimeoutConstant = 1000; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadIntervalTimeout = 1; SetCommTimeouts(m_GpsMudle, &timeouts); //设置读取数据超时时间 PurgeComm(m_GpsMudle,PURGE_TXCLEAR|PURGE_RXCLEAR); //清理缓存 /***************** 设置一个线程开始读取GPS数据 ******************/ SetCommMask( m_GpsMudle,EV_RXCHAR|EV_CTS|EV_DSR|EV_RING); while(1) { ReadFile( g_GpsModule.GetSafeHandle(), &bbyte, 1, &dwBytesTransferred, 0); if(bbyte = '$') //表示有效的GPS信息,具体看GPS的格式,这里不说了。 { } } /************************************* // 转载请保留作者信息 // author: sylar xiong jian // QQ:67666938 cug@live.cn // data: 2010.4.21 PM 22:20 after a shower! //2 Symbian OS 5TH S60 // refer: http://www.newlc.com/en/playing-n95?page=2 // 无错误处理和析构 ***************************************/ //首先解释下 symbian 的活动对象概念,非常类似于ACE和其他服务器模型,也类似于windows消息传递机制,所以非常简单。 //ActiveObjec symbian 里的活动对象类似于windows里的窗口,是接收消息的基本单元。所有的ActiveObject在创建后会通过CActiveScheduler::Add 把自己加入到Scheduler里面。每个ActiveObjec里有一个iStatus标识,类似于windows里面的窗口句柄。 //Scheduler 是一个独立线程的调度器,也就是主线程和ActiveObjec在一个线程,而调度器Scheduler单独为一个线程,Scheduler阻塞一直到有事件到来,然后根据iStatus标识调用相对于的活动对象ActiveObjec的RunL函数。 [code]#include <lbsposition.h>#include <lbssatellite.h>
#include <lbsposition.h>
RPositionServer iPosServer; //表示定位服务器
#include <lbssatellite.h>
RPositioner iPositioner; //会话
void CCActivePositioner::ConstructL(CFirstGpsAppView *aView)
{
iView = aView;
// Connect to the position server
TInt error = iPosServer.Connect( ); //连接到定位服务器
// Open subsession to the position server
error = iPositioner.Open(iPosServer); //获得和定位服务器的会话
// Set position requestor 告诉LBS谁需要位置服务
error = iPositioner.SetRequestor( CRequestor::ERequestorService,CRequestor::EFormatApplication , KRequestor );
// Set update interval to one second to receive one position data per second
TPositionUpdateOptions upOpt;
upOpt.SetUpdateInterval(TTimeIntervalMicroSeconds(1000000)); //GPS位置下载时间间隔 1秒
upOpt.SetUpdateTimeOut(TTimeIntervalMicroSeconds(1000000 * 15)); //超时时间 15s
upOpt.SetMaxUpdateAge(TTimeIntervalMicroSeconds(KMaxAge));
// Set update options
error = iPositioner.SetUpdateOptions( upOpt ); //应用上面的设置,每1秒下载一次GPS位置信息
// Request first position NotifyPositionUpdate
iPositioner.NotifyPositionUpdate(iPositionInfo,iStatus); //开始异步的获取位置信息..
// Set this object active
SetActive();
}
void CCActivePositioner::RunL()
{
switch (iStatus.Int())
{
// The fix is valid
case KErrNone:
case KPositionPartialUpdate: //异步的获得了GPS信息//如果有GPS信号了则进入这里运行,触发条件就是上面的 iPositioner.NotifyPositionUpdate(iPositionInfo,iStatus);
{
com_pool_data_t *sent = NULL;
TUint8 sent_num, i = 0;
TBuf8<COM_BUFFER_ITEM_SIZE> sent_data;
// get the NMEASentences and add into the list
iPositionGeneInfo->GetValue(EPositionFieldNMEASentences, sent_num); //
for (i = 0; i < sent_num; i++)
{
sent = comm_alloc_data(&com_pool_head);
if (sent == NULL){
comm_free_all_data(&com_pool_head, &g_gps_data_head);
sent = comm_alloc_data(&com_pool_head);
}
iPositionGeneInfo->GetValue(EPositionFieldNMEASentencesStart+i, sent_data);
memcpy(sent->data, sent_data.Ptr(), sent_data.Length());
list_add_before(&sent->list_node, &g_gps_data_head); //g_gps_data_head是一个linux链表,将sent的内容插入到这个链表中
}
break;
}
default:
break;
}
//再次请求GPS信息,这样就形成了一个循环。每1秒请求一次GPS信息
iPositioner.NotifyPositionUpdate(*iPositionGeneInfo, iStatus);
SetActive();
}
[/code]
有点累,而且代码还不能确定,所以android和iphone平台的GPS操作,我会下回补上的。
相关文章推荐
- iOS 各种网络编程总结--进程、线程、Socket、HTTP、TCP/IP、TCP和UDP
- 关于socket网络编程,各种报错若干总结
- VC++ Windows平台字符透明编程大总结
- VC++ Windows平台字符透明编程大总结
- 各种开发编程学习网站总结
- Intel 平台编程总结----缓存的优化
- iOS 各种网络编程总结--进程、线程、Socket、HTTP、TCP/IP、TCP和UDP
- platform驱动模型编程总结(基于mini2440平台的LED驱动)
- ACCP5.0 深入.NET平台和C#编程 小总结
- 18Spring_AOP编程(AspectJ)_AspectJ的各种通知总结
- iOS ***各种网络编程面试总结****
- (转)iOS 各种网络编程总结--进程、线程、Socket、HTTP、TCP/IP、TCP和UDP
- Intel 平台编程总结----SIMD技术
- Android 平台上编程实现 GPS 定位
- VC++ Windows平台字符透明编程大总结(转)
- VC平台下各种字符串定义总结
- VC++ Windows平台字符透明编程大总结
- 深入.NET平台和C#编程---总结
- iOS ***各种网络编程面试总结****
- VC++ Windows平台字符透明编程大总结 - [C/C++]