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

2023-05-16

一篇提及如何通过串口读取并提取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接收板环境下调试通过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐