VC++编写GPS的串口通信

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

VC++编写GPS的串口通信作者:ths.本文可以转载,请以超链接标明原始出处和作者信息及版权声明网址:=347::源代码::GPS通信真的好多事情,这个代码也是半年前写的了,拿出来贴贴。阅读此文之前,如果你还不知道如何编写VC++的串口通信,那么你可以先看我的这篇文章:VC++编写串口通信.GPS(GolbalPositionSystem)全球定位系统是一个在做一些项目中很常用到的仪器,它通过卫星的通信可以返回给你你当前所处的时间,时区,经纬度等等。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();}voidCGPSDlg::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全球定位系统定位数据的提取》其实数据的提取就是对接收过来的字符串进行分析,个人认为比较可简洁高效的方法是正则表达式法。但我当时使用的是最土的逐字分析法,先查找$帧开头,得到一个帧数据后再对这个帧数据分析,反正就是写得很”猥琐”,不过这么写起来也不难就是了。因为方法太土,也就没有什么好讲的了,自己看代码。voidCGPSDlg::OnCommMscomm1(){CStringstr=_T();VARIANTvar_in;CStringstrtemp;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);//数据存放变量CStringGpsTime,GpsPosWei,GpsDirWei,GpsPosJing,GpsDirJing,GpsDate;//从m_str中读取时间和经纬度intstart=0,end=0;if((start=m_str.Find(_T($GPRMC)))=0){end=m_str.Find('$',start+1);if(endstart){intindex=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){case2://读得格林威治时间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小时inthour=(GpsTime[0]-'0')*10+(GpsTime[1]-'0')+8;hour%=24;//获取GpsTime得Buffer,并对其进行写操作LPTSTRptr=GpsTime.GetBuffer(30);if(hour10)ptr[0]='0';elseptr[0]=hour/10+'0';ptr[1]=hour%10+'0';GpsTime.ReleaseBuffer();//合并日期和时间CStringtmp=_T(北京时间:);tmp+=GpsDate[4];tmp+=GpsDate[5];tmp+='-';tmp+=GpsDate[2];tmp+=GpsDate[3];tmp+='-';tmp+=GpsDate[0];tmp+=GpsDate[1];tmp+='';inti,j;for(i=j=0;jGpsDate.GetLength();++i){charc=(CHAR)((i%3==2)?':':GpsTime[j++]);tmp+=c;}//AfxMessageBox(m_str);//AfxMessageBox(strtemp);AfxMessageBox(tmp);//AfxMessageBox(GpsTime+_T(\n\r)+GpsPosWei+_T(\n\r)+GpsDirWei//+_T(\n\r)+GpsPosJing+_T(\n\r)+GpsDirJing+_T(\n\r)+GpsDate);}}}}}在分析数据的时候有几点需要注意一下:1.我们出在东八区,所以北京时间是格林威治时间再+8个小时,不然这个容易写错。2.如果你的GPS的质量不好或者你所处的位置的信号不好,往往会接收不到的所在位置的经纬度。这里尝尝会误认为是自己数据分析错了。记得当初我也在这里出过问题,弄我火了抱起电脑跑到老校区的科学喽15楼顶去测,发现是信号不好的问题,我的程序是yes的。其它也就没有什么了,至于显示,我是采用CListBox进行显示的,这样就可以通过CListBox信息变化考到接收过来的gps信息了。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功