《VC++编写GPS的串口通信.doc》由会员分享,可在线阅读,更多相关《VC++编写GPS的串口通信.doc(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、VC+编写GPS的串口通信作者: ths.本文可以转载,请以超链接标明原始出处和作者信息及版权声明 网址: :源代码: GPS通信真的好多事情,这个代码也是半年前写的了,拿出来贴贴。阅读此文之前,如果你还不知道如何编写VC+的串口通信,那么你可以先看我的这篇文章:VC+编写串口通信.GPS(Golbal Position System)全球定位系统是一个在做一些项目中很常用到的仪器,它通过卫星的通信可以返回给你你当前所处的时间,时区,经纬度等等。VC+编写GPS通信是属于典型的基本的串口通信例子,而且只用接收信息即可,不用对GPS发送信息。编写通信的方法的前半部分都跟我上篇文章说的串口通信一样
2、,即注册ActiveX,建立实例及事件的映射等等。完成上面的操作后,你就可以接收的GPS发来的信息了。CGPSDlg:CGPSDlg(CWnd* pParent /*=NULL*/) : CDialog(CGPSDlg:IDD, pParent) m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); m_port = 1; /端口号设置为1 m_strset = _T(38400, n, 8, 1);/串口参数,波特率:38400, 8为数据位,1为停止位 m_inputBuffer = _T(); /清空输入缓冲区 m_str = _T();void
3、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
4、); /文本模式获取数据 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全
5、球定位系统定位数据的提取其实数据的提取就是对接收过来的字符串进行分析,个人认为比较可简洁高效的方法是正则表达式法。但我当时使用的是最土的逐字分析法,先查找$帧开头,得到一个帧数据后再对这个帧数据分析,反正就是写得很”猥琐”,不过这么写起来也不难就是了。因为方法太土,也就没有什么好讲的了,自己看代码。void CGPSDlg:OnCommMscomm1() CString str = _T(); VARIANT var_in; CString strtemp; if(m_comm.get_CommEvent() = 2) /事件值为2表示接收缓冲区内有字符 var_in = m_comm.get
6、_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($GP
7、RMC) = 0) end = m_str.Find($, start + 1); if(end start) int 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;
8、 end = strtemp.Find(, start); /end指向第index个逗号 switch(index) case 2:/读得格林威治时间 GpsTime = strtemp.Mid(start, end - start); break; case 4:/读得纬度 GpsPosWei = strtemp.Mid(start, end - start); break; case 5:/读得纬度方向 GpsDirWei = strtemp.Mid(start, end - start); break; case 6:/读得经度 GpsPosJing = strtemp.Mid(sta
9、rt, end - start); case 7:/读得经度方向 GpsDirJing = strtemp.Mid(start, end - start); break; case 10:/读得当前日期 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 = GpsT
10、ime.GetBuffer(30); if(hour 10) ptr0 = 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
11、= 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) + GpsPosJing + _T(nr) + GpsDirJing + _T(nr) + GpsDate); 在分析数据的时候有几点需要注意一下:1. 我们出在东八区,所以北京时间是格林威治时间再+8个小时,不然这个容易写错。 2. 如果你的GPS的质量不好或者你所处的位置的信号不好,往往会接收不到的所在位置的经纬度。这里尝尝会误认为是自己数据分析错了。记得当初我也在这里出过问题,弄我火了抱起电脑跑到老校区的科学喽15楼顶去测,发现是信号不好的问题,我的程序是yes的。 其它也就没有什么了,至于显示,我是采用CListBox进行显示的,这样就可以通过CListBox信息变化考到接收过来的gps信息了。
限制150内