您的位置:首页 > 编程语言

各种平台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操作,我会下回补上的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: