`
guowee
  • 浏览: 177266 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

GPS短信接收 与 导航软件通信

阅读更多

这是开这个博客的第一篇文章, 在这里开博客主要是为了写一下以前主要是以后做过的东西,记录一下自己的技术,以便自己以后查找或和朋友们一起探讨. 很遗憾的是这篇文章讲的跟自己的工作用的技术不一样, 工作主要是做Linux下边的驱动或应用程序的开发, 很少做过Windows下边的东西.第一次写技术方面的东西,也不知道该怎么开始,怎么结婚,怎么组织,怎么表述. 不过就按自己心中的想法,尽量把有用的能和大家一起探讨的东西写出来. 也有些未处理或处理效果不太好的东西, 希望大家也能给提示一下. 先在这儿多谢了!~~

这几天帮朋友做了一个Windows Mobile手机的GPS定位信息短信的收取处理"程序"(DLL). 一开始根本没有玩过Windows Mobile这套系统的开发. 主要是为了学习一下Windows Mobile操作系统的软件开发.

项目需求:

1.          能够遍历接收到的短信,挑出有定位信息格式的闰转换成GPS导航软件需要的格式.

2.          具有单次定位的功能

单次定位就是把打开的当前短信进行读并转换成相应的GPS导航软件需要的格式发给导航软件.

3.          具有连续定位的功能

连续定位就是把当前打开的短信以后收到的所有短信都读取并转换成相应导航软件的格式发送给导航软件.

4.          能够结束定位.

5.       当开始单次或多次定位时,能自动打开GPS导航软件.

6.          能够配置GPS导航软件所在的位置.

7.          能够配置需要本软件发送的串口.

项目开发结果
其中: 1显示了短信列表的GPS定位菜单的形式, 2显示了在打开发短信里菜单的情况. 本来以为这两个菜单函数应该一样, 可后来发现, 还是有一些差别的, 就是Windows Mobile系统在不同的地方传递不同的当前文件信息. 也描述不清楚了,呵呵,就是Windows Mobile在菜单调用时会根据不同的地方(在短信列表或打开的短信里)会传递不同的参数. 找这到参数格式和信息让我头疼了一天.

                           

  

                      图 1                                                                   2                                           图 3

数据流程:

 

项目开发遇到的问题.

1.          串口问题

a)          还是首次在应用程序下对串口读写呢,以后只是用过串口调试工具. 所以不免有些担心. 谁知道串口到是没有给我找什么麻烦. 就是在Open的时候,一定要在最后边加上一个”:”分号

b)         : “COM5:”

c)          代码:

                         i.              代码主要是三个函数, 我本来写把这些东西组织成一个类, 结果由于时间人仓促,第一次做Windows Mobile, 急急忙忙, 本着能解决问题就行的想法写完了, 等以后有时间整理出来再说吧, 今天先把未整理的贴出来. 也希望能给朋友们一些帮助;

                        ii.              OpenCOMM()

 

BOOL GPSSerial::OpenPort(LPTSTR lpszPortName)
{
    if(!lpszPortName)
    {
        lpszPortName = m_COM;
    }
    if(hPort != INVALID_HANDLE_VALUE)
    {
        return TRUE;
    }
    hPort = CreateFile(lpszPortName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
    
//如果打开端口出错, 返回FALSE
    if ( hPort == INVALID_HANDLE_VALUE )
    {
        return FALSE;
    }
    
//指定端口监测的事件集
    SetCommMask (hPort, EV_RXCHAR);
    
//分配设备缓冲区
    SetupComm(hPort,512,512);
    
//初始化缓冲区中的信息
    PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);
    
//配置串行端口
    if (!SetCommState (hPort, &PortDCB))
    {


    }
    
//设置端口超时值
    InitCommTimeouts();

    EscapeCommFunction (hPort, SETDTR);
    EscapeCommFunction (hPort, SETRTS);
    m_bConnected=TRUE;
    return TRUE;
}

                      iii.              CloseCOMM()

 

BOOL GPSSerial::ClosePort()
{
    if (hPort != INVALID_HANDLE_VALUE)
    {
        
//设置连接属性为FALSE
        m_bConnected=FALSE;
        _running=FALSE;
        
//结束线程中WaitCommEvent的等待
        SetCommMask(hPort,0);
        
//阻塞至线程停止
        if(hCommThread)
        {
            TerminateThread(hCommThread,0);
            CloseHandle(hCommThread);
            hCommThread=NULL;
        }
        
//清除端口上指定信号的状态
        EscapeCommFunction(hPort,CLRDTR);
        EscapeCommFunction(hPort,CLRRTS);
        
//清除驱动程序内部的发送和接收队列
        PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);
        
//关闭串口
        CloseHandle (hPort);
        hPort = INVALID_HANDLE_VALUE;
    }
    return TRUE;
}

                      iv.              WriteCOMM()

 CHAR GPSXXbuf[128];
 DWORD dwBytesWritten;
 BOOL fWriteState;

 /* Generate GPRMC Format-Info And Send it */
 memset(GPSXXbuf,0,128);
 RMC2GPRMC(rmc,GPSXXbuf,utime,udate);
 fWriteState=WriteFile(hPort,GPSXXbuf,strlen(GPSXXbuf),&dwBytesWritten,NULL);
 if(!fWriteState)
 {
  dwBytesWritten=0;
  return FALSE;
 }
 return S_OK;

                        v.              ReadCOMM()因为没有涉及到要去读串口,所以这个函数没有实现, 其实如果朋友需要的话可以参考WriteCOMM()或直接MSDN

2.          菜单问题

a)          怎么在短信菜单上加一项菜单

                         i.              Windows 扩展菜单的时候是一个很不错的方式(虽然刚开始的时候我叫它为变态”). 不过我现在还没有弄通整菜单实现的方式, 不过就我查过的MSDN来说,它可以对短信, 图片, 文件夹等一些功能添加扩展菜单.  包括普通的菜单和上下文菜单(也叫右键菜单 context-menu) . 在本项目里我只实现了普通的菜单, 利用的是Windows MobileSDK IndoxMenuExtensibility 例子. 上边有扩展普通菜单和添加上下文菜单(Context Menu)的功能. 在本例子中添加一个菜单的流程为:

1.          InboxMenuExt.cpp文件的最开始的地方定义一个菜单的TEXT文本的变量.

const TCHAR cszDeleteAll[] = TEXT("Delete All");

2.          MenuExtension::GetCommandStringHelper()函数里添加一个if语句, 根据上边例子就可以了,其中: Context表示是一个上下文菜单, softkey表示一个普通的按键菜单.

3.          MenuExtension::QueryContextMenu()函数里添加两个语句, 给刚定义的菜单申明一个变量(InboxMenuExt.hMenuExtension类里: UINT m_idc2; 然后加两个语句:

a)          GetCommandStringHelper(m_idc1, szItemName, ARRAYSIZE(szItemName)); 其实就是把刚才的定义的菜单显示的文字CopyszItemName变量里,然后再生成一个菜单并插入到系统的菜单里.

b)         InsertMenuItem(hmenu, indexMenu, m_idc1, szItemName);hmenu菜单里插入一个m_idc1标识的菜单名为szItemName的菜单. 当时看到这个就郁闷了, 为什么没有给它一个回调函数来处理这个菜单被点击的事件呢. 其实这个函数只负责菜单的显示, 并不处理click处理. 处理函数会通过调用另外一个函数进行的.如下边讲.

4.          MenuExtension::InvokeCommand()添加一个菜单被点击时调用哪个函数来处理这个菜单.

a)          Context表示上下文菜单(右键菜单)

b)         Softkey表示普通的按键菜单

c)          if (!_tcscmp(cszMarkAll, (LPCTSTR)lpici->lpVerb)) 就是比较被点击的菜单是否和我们刚刚添加的菜单匹配,如果匹配则调用本菜单的处理函数NND, 比较一下就O. 一下子感觉很高深的东西变成了一if的比较语句. 当时直骂Windows变态. 可结果我却发现这种方式非常的方便,如果我再改这个菜单的处理函数, 我只需要在这儿改动一下就行了,无需要关系其它的. ..方便,,呵呵

                    if (!_tcscmp(cszMarkAll, (LPCTSTR)lpici->lpVerb))

                    {

                    hr = MarkAllInFolderAsRead();

                    CHR(hr);                   

                    }

5.          它怎么知道什么时候调用ContextSoftkey? 其实本程序实现上就是一个 COM组件(其实我不懂COM是一个什么东西), Contextsoftkey是这个组件的两个不同的实例而已. Windows Mobile每当打开一个菜单时,会根据本菜单所在的注册表扩展菜单的地方找出注册的扩展菜单, 然后调用扩展菜单的COM入口函数初始化菜单.生成一个MenuExtsion实例.  所以, 你把本程序的.dll注册到什么地方, 什么地方就有本菜单的菜单项..而每个地方都会有两种形式的菜单: 上下文菜单和普通的按键菜单. 而本程序把.dll文件注册到了: " "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Shell\\Extensions\\ContextMenus\\Inbox\\" Inbox表示短信, 所以我们添加的菜单就自动添加到短信菜单了.

6.        当然了,怎么区分上下文菜单和普通菜单呢? 所以在 HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Shell\\Extensions\\ContextMenus\\Inbox\\" 下边有两个子目录:

a)        List_View_Context 表示一个Context 菜单(上下文菜单)

b)        List_View 表示一个普通的菜单(普通菜单)

b)         怎么加一个菜单,它有N个子菜单

                         i.              不说了,直接源码吧,比说什么都好:

HMENU hMenu; 
                   hMenu = CreatePopupMenu();
                   
// Get item text 
                   hr = GetCommandStringHelper(m_idc2, szItemName, ARRAYSIZE(szItemName)); 
                   CHR(hr);
                   
// Insert the item
                   hr = AppendMenu (hMenu, MF_STRING | MF_ENABLED, m_idc2,szItemName); 
                   CHR(hr);
                   
// Get item text 
                   hr = GetCommandStringHelper(m_idc3, szItemName, ARRAYSIZE(szItemName)); 
                   CHR(hr);
                   
// Insert the item
                   
//hr = InsertMenuItem(hmenu, indexMenu, m_idc3, szItemName);
                   hr = AppendMenu (hMenu, MF_STRING | MF_ENABLED, m_idc3,szItemName); 
                   CHR(hr);
                   hr = GetCommandStringHelper(m_idc1, szItemName, ARRAYSIZE(szItemName));
                   
//hr = InsertMenuItem(hmenu, indexMenu, m_idc1, szItemName);
                   hr = AppendMenu (hMenu, MF_STRING | MF_ENABLED, m_idc1, szItemName); 
                   CHR(hr);
                       hr = GetCommandStringHelper(m_idc4, szItemName, RRAYSIZE(szItemName));
                   
//hr = InsertMenuItem(hmenu, indexMenu, m_idc1, szItemName);
                   hr = AppendMenu (hMenu, MF_STRING | MF_ENABLED, m_idc4, szItemName); 
                   CHR(hr);
                   hr = AppendMenu (hmenu, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)hMenu, L"GPS定位");
                   CHR(hr);

c)          怎么在打开的短信里加一项菜单

                      i.              List_View_Context 表示一个Context 菜单(上下文菜单)

                   ii.              List_View 表示一个普通的菜单(普通菜单)

                iii.              Read_View 其实可以用 Read_xxx, 没有研究透, 一试这个可以, 就懒得往研究了.

3.          线程问题

a)          怎么用线程去发送数据到串口

                         i.              还真没有在Windows下弄过线程呢, 不过也好整,创建一下就行了, 当然查资料的时候郁闷的地方就是, Wincows下的线程是发射后不管的方式, 创建后直接把得到的句给Close, 但线程照样运行. 当时我那个汗啊所以我对线程的回收直接是让线程退出方式,不想用了就给它的一个变量做一个FALSE退出了,省得再研究那麻烦的东西了.

                        ii.              下边是创建代码:

     if ((hCommThread = CreateThread (NULL, 0, SendGPSInfoToCommThread, (LPVOID)this, 0,&dwThreadID)) == NULL). 其实this是我自己参数,朋友们可以换成自己的线程参数.

 

b)         和类的关系

                         i.              当时我自己实现一个串口类, 我就想把这个线程弄到这个串口类里去,让类管理这个线程,可后来就直接用了一个全局线程函数给解决了, 现在感觉自己弄的这个类还不男不女的, 都不好分层次了, 不过这个项目上就是能用就行, 我也不想再多研究了.

4.          弹出窗体问题

a)          实在对VCVS没着啊, 就为了能打开一个弹出窗体, 死活我整了一天, 整整一天..郁闷的我急上火下的.

b)         在项目的resource</s

分享到:
评论

相关推荐

    电信设备-接收移动通讯信息输入的GPS接收终端及GPS接收系统.zip

    而“接收移动通讯信息输入”意味着该GPS接收终端不仅仅是一个简单的定位设备,还能与移动通信网络交互,接收如短信、数据包等信息。这样的功能扩展了GPS的应用范围,例如,它可以用于紧急呼叫定位、车辆跟踪、智能...

    GSM-GPS通信控制程序

    GSM-GPS通信控制程序是一种综合了全球移动通信系统(GSM)与全球定位系统(GPS)技术的应用,主要用于远程监控、追踪、定位以及数据交换。在这个程序中,GSM模块用于建立无线通信,实现远程数据传输,而GPS模块则...

    GPS GPRS采集数据 发送短信 物流追踪系统

    首先,GPS是全球卫星导航系统,它通过接收多颗卫星发射的信号来计算设备的精确地理位置。在物流追踪系统中,车载GPS模块会不断获取车辆的位置信息,包括经度、纬度、速度和时间戳等。这些数据提供了车辆实时行进状态...

    基于GPS的汽车导航系统简介.pdf

    GPS导航模块接收卫星信号进行定位,而自主导航模块在GPS信号丢失时,利用车速传感器和方位传感器(如地磁方位传感器和电子陀螺仪)来确定车辆的位置和行驶状态,确保在各种复杂路况下仍能提供准确的导航服务。...

    电信设备-导航移动终端及导航通信的方法.zip

    在当今信息化社会,导航移动终端与导航通信技术已经成为我们日常生活中不可或缺的一部分。本资料主要探讨了电信设备中的导航移动终端及其导航通信方法,旨在深入理解这些技术的工作原理、应用场景以及未来发展趋势。...

    基于GPS的车辆导航及GPRS网络监控

    例如,深圳宏电公司的H7000系列GPRS通信模块便采用了TCP/IP协议栈,实现了数据的实时交换,与传统的短信方式相比,通信成本更低,效率也更高。 监控中心是整个车辆导航及网络监控系统的重要组成部分。它一般由一台...

    gps.rar_GPS

    GPS模块可以与主处理器通信,将接收到的数据解析成可用格式,或者根据应用程序的需求发送特定命令到模块。 标签“gps”进一步强调了主题的重点,即全球定位系统的技术和应用。这可能涉及到的知识点包括: 1. GPS...

    追踪器下位机_短信_GPS_

    总结,追踪器下位机是结合GPS定位与短信通信技术的智能设备,广泛应用于多种场景,其核心在于精确的定位能力、高效的通信机制以及对命令的响应。理解和掌握这些知识点,有助于更好地利用此类设备来满足各种实际需求...

    51单片机+GPS定位+sim800发短信

    51单片机将处理过的GPS位置信息转化为适合短信格式的数据,然后通过串行通信接口与SIM800模块交互,发送短信到预设的接收号码。 **实现过程**: 1. **初始化**:首先,51单片机需要初始化并配置GPS模块和SIM800模块...

    GSM模块对终端GPS数据的通信实现.pdf

    GSM模块是基于GSM网络的通信模块,可以发送和接收短信或进行语音通信。在本文中,作者曹洁和郭春禹探讨了如何在VC++环境下利用GSM模块与终端GPS设备进行通信,从而获取并处理GPS数据。 首先,GSM模块通常使用AT...

    基于GPRS网络的GPS图形导航仪

    随着科技的快速发展和人们对通信及导航技术的高需求,GPS导航系统在交通、航海、安全等多个领域得到了广泛应用。然而,传统的GPS导航设备往往缺乏有效的无线数据传输功能,限制了其实时性和可靠性。基于此,本文提出...

    电信设备-GPS-GSM短信便携式装置.zip

    5. 软件实现,包括GPS定位软件、GSM通信协议栈、短信服务API以及数据传输的安全性。 6. 实际应用案例,展示如何利用这种设备来解决实际问题。 7. 系统测试和故障排查方法,确保设备在各种环境下的可靠运行。 8. 法规...

    GPS串口gsm多功调试助手.zip

    1. **GPS数据读取**:软件能够接收来自GPS模块的NMEA(全球导航卫星系统)协议数据,如$GPGGA、$GPGLL等,解析出经纬度、高度、速度、日期和时间等信息。 2. **串口通信**:通过串口(如COM端口)与GPS和GSM模块...

    基于GPRS网络的GPS图形导航仪 

    随着科技进步和人们对通信及导航技术需求的增加,GPS定位导航系统在交通、航海、安全等多个领域得到广泛应用。然而,传统的GPS导航设备往往缺乏有效的实时数据传输功能,主要依赖短信方式,存在不稳定性和低效率问题...

    GSM.rar_GSM_GSM.rar_GSM短信发送_gsm gps

    - 在“GSM_gps_”标签中,可能包含将GSM通信与GPS(Global Positioning System)定位服务结合的应用。 - 这种集成允许设备通过GSM网络发送其GPS坐标,实现远程追踪、导航和紧急定位服务。 - 例如,GPS数据可以...

    基于GPS的物流运输管理系统的实现技术

    软件设计则包括GPS短信接收处理程序的编写,GIS应用程序的开发,以及数据库的构建和维护,确保数据的准确性和实时性。 通过这样的系统,物流企业在提升运作效率和管理水平的同时,还能实现事故车辆的快速响应、实时...

    电信设备-一种航海通信导航仪.zip

    首先,GPS是航海通信导航仪的核心组成部分,通过接收来自多颗卫星的信号,计算出船只的精确位置,为船舶的导航提供基础数据。同时,GPS还可以提供时间信息,对船上设备的时间同步起到关键作用。 其次,VHF通信系统...

    GPS-Library-for-proteus_it_GPS_

    这个库可能是为了让用户在 Proteus 中模拟 GPS 设备的行为,以便在设计嵌入式系统或物联网(IoT)项目时,无需实际硬件就能验证 GPS 接收器的通信和数据处理。 【描述】"it very good in sending and receiving ...

    电信设备-基于北斗短报文和4G通信模式的北斗自主导航的方法.zip

    在现代通信与导航技术领域,北斗卫星导航系统已经成为了与GPS、GLONASS和Galileo并驾齐驱的重要全球卫星导航系统。本资料深入探讨了一种结合北斗短报文服务与4G通信模式的自主导航方法,为电信设备的定位、通信与...

Global site tag (gtag.js) - Google Analytics