微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > 基于PC/104的实时姿态数据采集系统的设计与实现

基于PC/104的实时姿态数据采集系统的设计与实现

时间:07-15 来源:互联网 点击:
3.1 系统软件组成  
整个软件系统包括固定站操控软件和流动站操控软件。如图2所示。

   

图2软件模块组成图

流动站操控软件主要完成通过串行接口接收手持机内部GPS接收机数据、外部姿态传感器数据,并将数据进行处理、存储、显示、打包下行发送等功能。总的来说在结构上主要分为:端口初始化模块;数据接收模块;数据处理模块;数据输出模块。在数据打包下行过程中,软件将接收的姿态传感器数据和GPS接收机数据自定义格式进行打包,一起输出给无线数传设备。

固定站操控软件完成Beeline接收机数据、平台姿态传感器数据和流动站通过数传设备输入的数据接收工作,经过处理后,将有效的姿态数据通过USB接口输出给试验设备使用。在结构上由以下功能模块组成:

初始化模块。

该模块在软件启动时,完成程序初始化,对各个端口的设置,包括串行口协议设定,USB接口初始化等。另外还要对固定站的Beeline GPS 接收机进行初始化设置,以使之按照要求输出有效数据。

数据接收模块。

数据接收模块包括固定站GPS数据接收子程序、流动站打包数据接收子程序和固定站平台姿态数据接收子程序。

数据处理模块

数据转换模块完成数据包的解包过程,并且根据流动站与固定站定位信息计算两者间距离及流动站以固定站为原点在空间直角坐标系中的方位角和俯仰角。

数据输出模块

数据输出主要用来将有效的姿态数据通过USB接口输出给受试设备。

3.2 软件设计难点分析

从图1中不难看出,无论是固定站还是流动站,对串口进行操作都是一个不可或缺的方面。固定站有3个串口操作,流动站需要3个串口操作。因此,设计过程中,统一采用YbCommDevice串口控件实现。通信参数可直接在属性中设定,在程序运行过程中也可通过输入界面进行多次更改。它支持任意格式的数据包收发,支持多种数据包协议,操作简单、实用,是一个较为实用的C++ Builder串口控件[4]。在实现时,按照协议统一的原则,设定串口数据格式为9600bps,1个起始位,8个数据位,1个停止位,无奇偶校验。

在软件的设计开发过程中发现包括GPS数据、传感器数据等各种数据包均有固定格式,因此, 数据包的格式分析是重要一环。

1.GPS输出格式分析:两型GPS接收机的定位信息格式为NMEA-0183格式。这一格式是较常用的一种数据通信标准,它是在0180和0182的基础上增加了GPS接收机输出内容而完成的。此格式直观、易处理的优点使得几乎所有的接收机及OEM板都采用了这一格式。典型输出的语句如下所示:

$ AABBB,ddd ……………………ddd,*hh<CR><LF>
其各字段定义如下:
$:起始语句头;
AA:对话设备识别符;
BBB:语句名;
,:域分隔符;
ddd…ddd:发送的数据内容;
*:校验和符号;
hh:校验和;
<CR><LF>:终止符(回车、换行)。

2.倾角传感器输出格式分析:倾角传感器数据包为6字节的定长数据包,数据格式如表1所示。数据头字节和最后的校验和字节用于通信同步,实际格式为ASCII码。具体定义如下:

         表1:倾角传感器数据包格式
   
3.USB接口操作:在对USB进行操作的时候,必须要利用WinDDK将设备驱动程序进行编译,主要步骤为:得到设备的厂家标识和产品标识,利用驱动程序的GUID值获取设备的文件名, 用 CreateFile 函数打开设备,接着利用设备文件名和驱动程序里面的 Pipe 名打开 Pipe, 访问这个 Pipe 对应的 USB 端点,利用CreateFile 得到的设备句柄,从而通过 DeviceIoControl 函数实现设备规定的动作。需要注意的是厂家标识、产品标识和GUID值在驱动程序的“*.inf”文件里面就可找到,如果没有,则需要联系设备生产厂家了;Pipe 名和DeviceIoControl函数的参数需要参考驱动程序资料才能找到。  
相关代码如下:

HANDLE hPipe = OpenDevPipe("Pipe1"); //驱动程序里面的 Pipe 名, 对应访问某个端点的 I/O,需要与驱动一致
if(hPipe != INVALID_HANDLE_VALUE) //打开 Pipe 成功
{
   WriteFile(hPipe, Buffer, BytesToWrite, &nBytesWritten, NULL); //把 Buffer 里面的字节写入 hPipe
   CloseHandle(hPipe);
}

//使用 DeviceIoControl 访问 USB 设备

HANDLE hDevice = OpenDevice();
if(hDevice != INVALID_HANDLE_VALUE) //打开设备成功
{
  if(DeviceIoControl(hDevice, IOCTL_READ_xxxx, &IOBlock, sizeof(IOBLOCK), &c, 1, &nBytes, NULL))
{
      //操作成功,
}
   CloseHandle(hDevice);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top