VC--编写GPS的串口通信解析_第1页
VC--编写GPS的串口通信解析_第2页
VC--编写GPS的串口通信解析_第3页
VC--编写GPS的串口通信解析_第4页
VC--编写GPS的串口通信解析_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC+编写GPS的串口通信作者: ths. 本文可以转载,请以超链接标明原始出处和作者信息及版权声明网址: /?p=347:源代码: GPS通信真的好多事情,这个代码也是半年前写的了,拿出来贴贴。阅读此文之前,如果你还不知道如何编写VC+的串口通信,那么你可以先看我的这篇文章:VC+编写串口通信.GPS(Golbal Position System全球定位系统是一个在做一些项目中很常用到的仪器,它通过卫星的通信可以返回给你你当前所处的时间,时区,经纬度等等。VC+编写GPS通信是属于典型的基本的串口通信例子,而且只用接收信息即可,不用对GPS发送信息。编写通信的方法的前半部分都跟我上篇文章说的串口通信一样,即注册ActiveX,建立实例及事件的映射等等。完成上面的操作后,你就可以接收的GPS 发来的信息了。CGPSDlg:CGPSDlg(CWnd* pParent/*=NULL*/: CDialog(CGPSDlg:IDD, pParentm_hIcon = AfxGetApp(-LoadIcon(IDR_MAINFRAME;m_port = 1; /端口号设置为1m_strset = _T(38400, n, 8, 1;/串口参数,波特率:38400, 8为数据位,1为停止位m_inputBuffer = _T(; /清空输入缓冲区m_str = _T(;void CGPSDlg:OnBnClickedButton1(/-m_str = _T(;/如果端口原来打开,则需要先关闭if(m_comm.get_PortOpen(m_comm.put_PortOpen(FALSE;/设置连接参数m_comm.put_CommPort(m_port; /指定串口号m_comm.put_Settings(m_strset; /通信参数设置m_comm.put_InBufferSize(1024; /指定接收缓冲区大小m_comm.put_InBufferCount(0; /清空输入缓冲区m_comm.put_InputMode(0; /文本模式获取数据m_comm.put_InputLen(0; /读取缓冲区的全部数据m_comm.put_RThreshold(1; /设置在产生OnComm事件前要接收的字符数阈值/打开端口连接if(!m_comm.get_PortOpen(m_comm.put_PortOpen(TRUE;/-但因为GPS发送来的信息是源源不断的帧数据,如果你直接阅读这些帧数据,你会发现根本无法阅读。所以接下来的关键一步就是对GPS的帧数据的格式分析,筛选出有用的数据。要筛选数据,首先你必须明白GPS的帧格式,这里我就不说了,你去看我百度 Hi里以前收集的这篇文章VC+实现GPS全球定位系统定位数据的提取其实数据的提取就是对接收过来的字符串进行分析,个人认为比较可简洁高效的方法是正则表达式法。但我当时使用的是最土的逐字分析法,先查找$帧开头,得到一个帧数据后再对这个帧数据分析,反正就是写得很”猥琐”,不过这么写起来也不难就是了。因为方法太土,也就没有什么好讲的了,自己看代码。void CGPSDlg:OnCommMscomm1(CString str = _T(;VARIANT var_in;CString strtemp;if(m_comm.get_CommEvent( = 2/事件值为2表示接收缓冲区内有字符var_in = m_comm.get_Input(; /读缓冲区m_str += var_in.bstrVal; /转换成CString类型if(m_str.GetLength( 100/如果端口原来打开,则需要先关闭if(m_comm.get_PortOpen(m_comm.put_PortOpen(FALSE;/数据存放变量CString GpsTime, GpsPosWei, GpsDirWei, GpsPosJing, GpsDirJing, GpsDate;/从m_str中读取时间和经纬度int start = 0, end = 0;if(start = m_str.Find(_T($GPRMC = 0end = m_str.Find($, start + 1;if(end startint index = 0;/截取得数据帧strtemp = m_str.Mid(start, end - start;(CListBox *GetDlgItem(IDC_LIST1-InsertString(0,strtemp;UpdateWindow(;m_str = _T(;/GetDlgItem(IDC_STATIC1-SetWindowTextW(strtemp;start= end = 0;while(index =12+ index;end = strtemp.Find(, start; /end指向第index个逗号switch(indexcase2:/读得格林威治时间GpsTime = strtemp.Mid(start, end - start;break;case4:/读得纬度GpsPosWei = strtemp.Mid(start, end - start;break;case5:/读得纬度方向GpsDirWei = strtemp.Mid(start, end - start;break;case6:/读得经度GpsPosJing = strtemp.Mid(start, end - start;case7:/读得经度方向GpsDirJing = strtemp.Mid(start, end - start;break;case10:/读得当前日期GpsDate = strtemp.Mid(start, end - start;break;start = end + 1;/格林威治时间转化为北京时间,时钟加8小时int hour = (GpsTime0 - 0 * 10 + (GpsTime1 - 0 + 8; hour %= 24;/获取GpsTime得Buffer,并对其进行写操作LPTSTR ptr = GpsTime.GetBuffer(30;if(hour 10ptr0 = 0;else ptr0 = hour / 10 + 0;ptr1 = hour % 10 + 0;GpsTime.ReleaseBuffer(;/合并日期和时间CString tmp =_T(北京时间: ;tmp += GpsDate4;tmp += GpsDate5;tmp += -;tmp += GpsDate2;tmp += GpsDate3;tmp += -; tmp += GpsDate0; tmp += GpsDate1; tmp += ; int i, j; for(i = j = 0;j GpsDate.GetLength(;+ i char c = (CHAR(i % 3 = 2 ? : : GpsTimej+; tmp += c; /AfxMessageBox(m_str; /AfxMessageBox(strtemp; AfxMessageBox(tmp; /AfxMessageBox(GpsTime + _T(nr + GpsPosWei + _T(nr + GpsDirWei / _T(nr + GpsDate; + _T(nr + GpsPosJing + _T(nr + GpsDirJing + 在分析数据的时候有几点需要注意一下: 1. 我们出在东八区,所以北京时间是格林威治时间再+8 个小时,不然这个容易写错. 2. 如果你的 GPS 的质量不好或者你所处的位置的信号不好, 往往会接

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论