资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
VC+VC+编写编写 GPSGPS 的串口通信的串口通信作者: ths. 本文可以转载,请以超链接标明原始出处和作者信息及版权声明 网址: http:/www.zhongsisi.com/?p=347 :源代码: GPS 通信真的好多事情,这个代码也是半年前写的了,拿出来贴贴。阅读此文之前,如果你还不知道如何编写 VC+的串口通信,那么你可以先 看我的这篇文章:VC+编写串口通信.GPS(Golbal Position System)全球定位系统是一个在做一些项目中很常用 到的仪器,它通过卫星的通信可以返回给你你当前所处的时间,时区,经纬度 等等。VC+编写 GPS 通信是属于典型的基本的串口通信例子,而且只用接收信 息即可,不用对 GPS 发送信息。编写通信的方法的前半部分都跟我上篇文章说的串口通信一样,即注册 ActiveX,建立实例及事件的映射等等。完成上面的操作后,你就可以接收的 GPS 发来的信息了。CGPSDlg:CGPSDlg(CWnd* pParent /*=NULL*/): CDialog(CGPSDlg:IDD, pParent)m_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“) = 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;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(start, 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 = GpsTime.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 = 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 信息了。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号