实验一. 北斗/GPS模块实验
实验目的
- 学习北斗GPS定位技术,掌握GPS协议标准;
- 掌握Android串口数据解析的方法;
- 掌握Handler的使用机制,实现子线程与UI线程的通信
实验环境
- 硬件:CBT-EMB-MIP 实验平台,PC机,北斗GPS双核模块;
- 软件:Android Studio;
实验内容
- 分析北斗GPS输出数据协议帧各数据位含义;
- 编写Android程序解析GPS数据;
实验原理
GPS简介
GPS(Global Positioning System), 即全球定位系统,它是一个由覆盖全球的24颗卫星组成的卫星系统。其目的是在全球范围内对地面和空中目标进行准确定位和监测。随着全球性空间定位信息应用的日益广泛,GPS提供的全时域、全天候、高精度定位服务将给空间技术、地球物理、大地测绘、遥感技术、交通调度、军事作战以及人们的日常生活带来巨大的变化和深远的影响。
GPS系统一般由地面控制站、导航卫星和用户接收机(GPS的移动用户端)三大部分组成。导航卫星至少24颗,均匀分布在6个极地轨道上,轨道的夹角为60度,距地平均高度为20200公里,每12恒星时绕地球一周。
北斗GPS标准NEMA数据格式协议介绍
北斗双核模块NEMA协议输出信息主要包括以下几个部分:
模式 | 语句名称 | 功能 |
---|---|---|
GPS模式 | ||
GPGGA | 坐标位置数据 | |
GPRMC | 运输定位数据 | |
GPGSA | DOP与有效卫星 | |
GPGSV | GPS卫星状态信息 | |
BD模式 | ||
BDGGA | 坐标位置数据 | |
BDRMC | 运输定位数据 | |
BDGSA | DOP与有效卫星 | |
BDGSV | BD卫星状态信息 | |
GPS&BD混合模式 | ||
GNGGA | 卫星定位信息 | |
GNRMC | 运输定位数据 | |
GNGSA | DOP与有效卫星 | |
GPGSV | GPS卫星状态信息 | |
BDGSV | BD卫星状态信息 | |
GNGLL | 含经、纬度的地理信息 | |
GNVTG | 对地方向及地面速度 |
本实验中所使用的北斗GPS模块工作在GPS&BD混合模式下,具体协议格式见光盘doc目录下的《BD-126输出数据协议文档.pdf》。
Android串口库使用方法
给Android Studio项目添加aar包引用
本地串口库aar包路径:Android光盘/src/chapter06/UartLibrary.aar
Android Studio新建好的项目结构如图4.3.1:
其中app是我们的主要module, libs下存放外部的library build.gradle是配置App module的,接下来主要对其操作。
图4.3.1
- 复制外部aar包
UartLibrary.aar
到libs目录下。 - 修改app目录下的
build.gradle
配置文件:
// 添加arr文件的引用 还要在dependencies里面添加引用
repositories {
flatDir {
dirs 'libs'
}
}
- 修改dependencies,添加如下一行:
// 添加AAR文件的引用,文件名字为UartLibrary,类型为aar
compile(name:'UartLibrary', ext:'aar')
其中name就是libs目录下UartLibrary.aar文件名称, ext是其扩展名。
- 重新编译项目,从工具栏依次选择:"Build"-->"rebuild project"。
编译完成后,在app/build/intermediates/exploded-aar/就可以看见我们引用的aar包内容,其中jar目录下是jar文件,res下是我们aar包里的资源文件。如图4.3.2所示:
图4.3.2
串口库API接口使用
API文档入口:Android光盘/doc/串口库API接口文档/index.html
。如图4.3.3所示:
图4.3.3 串口库API
- 添加动态广播接收者
BroadcastReceiver
,接收串口数据。
private final BroadcastReceiver SerialInfoReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d(TAG, "onReceive action" + action);
if ((ACTION_SERIAL).equals(action)) {
switch (intent.getIntExtra(RESULT_CODE, 0)) {
case OK_UART:
ShowMessage("串口:" + str_serial + " 打开成功!");
break;
case UART_RECEIVED: //接收到串口数据
Bundle bundle = intent.getExtras();
byte[] buf = bundle.getByteArray(UART_RECV_DATA);
Log.d(TAG, "onReceive uart:" + Convert.bytesToHexString(buf, buf.length));
result = Convert.asciiBytesToString(buf);
updateUI();
break;
case ERR_UART:
break;
case ERR_UART_STOP:
break;
case ERR_BAD_FILE_NUMBER:
ShowMessage("串口:" + str_serial + " 打开失败!");
break;
default:
break;
}
}
}
};
- 在
onResume
中注册广播,在onPause
中解除注册。
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(SerialInfoReceiver);
}
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_SERIAL);
filter.addAction(ACTION_CLOSE_SERIAL);
LocalBroadcastManager.getInstance(this).registerReceiver(SerialInfoReceiver, filter);
}
- 打开串口示例:
UartService.openUart(MainActivity.this, str_serial, baudRate, 0);
- 关闭串口示例:
UartService.stopUartService(MainActivity.this);
UartService.closeUart(MainActivity.this);
- 发送数据示例:
//发送字符串
UartService.getDev().sendData("hello", false);
//发送字节数组
UartService.getDev().sendData(byteArray, true);
实验步骤
导入工程源码
- 打开Android Studio,从菜单栏选择 File > Open。
- 弹窗中浏览选择光盘src目录下的Gradle工程 CH06_Extend ,点击OK导入。
- 等待工程构建完成后,在工具栏中的Android App列表中选择本实验例程CH06_01_GPS。
演示运行
- 平台主板通过miniUSB线连接电脑后,点击 Run 运行程序。
- 将平台主板GPS模块上方的跳线帽跳到
EXM1
处,拨码开关拨到ON
上给模块供电。 - 将GPS天线插上,并将外接天线放到室外。
- 在界面中选择串口1:
ttySAC1
,波特率:9600
,点击打开
按钮,打开成功后如图5.1所示弹出提示信息:
图5.1
- 等待数秒后界面中会显示当前定位信息,如图5.2所示:
图5.2 GPS实时定位信息