java 使用串口获取gps_一篇提及如何通过串口读取并提取GPS信号的论文

一篇提及如何通过串口读取并提取GPS信号的论文

作者:崔杰 梁计春 王国军

目前,在用计算机进行数据传输时,常用的是串行通信方式。在Visual C++的编程中,既可以用Windows API函数进行串行通信编程,也可以利用环境自带的控件进行编程。利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。

本文以Microsoft Communications Control(version 6.0)为例,介绍串行通信控件在VC++中的使用方法。

嵌入通信控件

使用串行通信控件前,首先要进行系统注册。

1、在建立新工程时,将ActiveX Controls复选框选中,表示本程序支持ActiveX 控件。

2、单击Project菜单,从中选择Add to Project,在弹出的对话框中单击Components and Controls选项,然后在弹出的对话框中再单击Registered ActiveX Controls选项。

3、在列表中选择Microsoft Communications Control (version6.0),形状为带有红色底座的黄色电话机。单击Insert按钮,确认后,会出现一个Confirm Classes对话框,其中列出了该控件的类名(CMSComm)、头文件名(MSComm.h)、执行文件名(MSComm.cpp)。

关闭此对话框,在程序主界面的控件列表中,可以看到该通信控件已被加入,拖动该控件就可以将其放入程序中。

编写通信程序

通信控件的工作原理类似于中断方式,当有通信事件发生时,如发送、接收数据,就会触发OnComm事件。在OnComm事件的处理函数中调用 GetCommEvent()函数,由该函数的返回值即可确定是什么类型的事件,并由此做出相应的处理。

下面以接收处理串口的GPS信号为例,说明该控件在编程中的具体应用。

利用MFC生成一个基于对话框的应用程序,对话框中的控件及其相应的消息与响应函数如下表所示。

控件名称

控件 ID

对应变量

通信控件

IDC_MSCOMM

m_Comm

接收按钮

IDC_BUTTON_RECEIVEGPSDATA

OnbuttonStartreceivegps()

GPS信号显示

IDC_EDIT_COMDATA

m_comdata

停止接收按钮

IDC_BUTTON_ENDRECEIVEGPSDATA

OnbuttonEndreceivegps()

设置控件各部分属性:

CommPort:1;

DTREnable:1;

InBufferSize:4096;

EOFEnable:TRUE;

Handshaking:nohandshaking;

InputMode:1-Binary;

NullDiscard:False;

Rthreshold:250;

RTSEnable:False;

Settings:9600,n,8,1;

Sthreshold:0。

部分程序如下:

//开始接收GPS信号

void CGpsDlg::OnButtonStartreceivegps()

{

//判断串口的状态,如果是关闭状态,则打开

if(!m_Comm.GetPortOpen() )

//打开串口

m_Comm.SetPortOpen(TRUE);

UpdateData(TRUE);

}

//停止接收GPS的信号

void CGpsDlg::OnButtonEndreceivegps();

{

//判断串口的状态,如果是打开状态,则关闭

if( m_Comm.GetPortOpen() )

m_Comm.SetPortOpen(FALSE);

UpdateData(FALSE);

}

//相应的OnComm事件处理

void CGpsDlg::OnComm()

{

m_comdata.Empty();

VARIANT m_input1;

COleSafeArray m_input2;

LONG length,i;

BYTE data[1024];

CString str;

//接收缓冲区内字符

if(m_Comm.GetCommEvent()== 2)

{

m_comdata.Empty();

//读取缓冲区内的数据

m_input1=m_Comm.GetInput();

//将VARIANT型变量转换为ColeSafeArray型变量

m_input2=m_input1;

//确定数据长度

length=m_input2.GetOneDimSize();

//将数据转换为BYTE型数组

for(i=0;i< length;i++)

m_input2.GetElement(&i,data+i);

//将数组转换为CString型变量

for(i=0;i< length;i++) {

char a=* (char *)(data+i);

str.Format("%c",a);

m_comdata += str;

}

/*在上面的程序中,先将VARIANT型变量转换为ColeSafeArray型变量,再将其转换为BYTE型数组,然后将数组转换为CString型变量,以满足不同的变量类型显示数据的需要。*/

//提取GPS信号

CString m_zjz;

m_zjz=m_comdata;

//寻找GPS信号的头标志

int s;

s=m_zjz.Find("$GPRMC,");

CString m_gps;

//NUM为所提取GPS信号的长度

m_gps=m_zjz.Mid(s,NUM);

int x;

x=m_gps.GetLength();

//信号长度不符合要求,则拒绝接收

if (x != NUM) {

m_gps.Empty();

}

//寻找所需要的GPS信号的头标志

int y;

y=m_gps.Find("$GPRMC,");

if (y != 0)

{

m_gps.Empty();

}

//m-gpsdata是已声明的类成员变量

m_gpsdata=m_gps;

}

}

这样就将GPS信号的数据流提取出来了。再通过简单的字符串操作就可以分别找出GPS信号中的经度、纬度以及相对应的格林威治时间等定位信息。

以上程序在Win98/95/NT、P133 PC机、ROCKWELL JUPITER GPS接收板环境下调试通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值