主控: Samsung Cortex ARM A8 smdkc110 1G
Gps: UNI-HRG001 GPS模块,单频12通道的,20hz定位数据更新率
单机:<2.5m (2DRMS)
DGPS:<0.5m(2DRMS)
系统: android 2.3
犹豫了很久自己总结的这边文档要不要发出来,主要是因为高精度在电子产品很少有用的到,最后还是为了以后可以方便自己查阅。
首先需要熟悉的是DGPS和单机定位的区别,DGPS是在普通的GPS基础上多了一个串口B,即需要两个串口,串口A用来接收GPS模块吐出的标准的NMEA数据和发命令用,串口B专门用来接收差分信息。
关于单机定位和上一篇文章讲述的是一致的,所以这里只分析DGPS定位
关于DGPS个人暂时是这样理解的:
串口A肯定还是要接收NMEA数据,同时还要告诉GPS模块要工作在DGPS mode,以及告诉GPS模块要设置其他一些配置,例如串口B的波特率等。
串口B是用来专门接收差分信号,然后发送给GPS模块来辅助提高定位的精度
所以引出以下几个我们要思考解决的问题
1、 如何保证串口A正常接收NMEA数据,还可以下发命令给GPS模块
2、 串口B的数据从何而来,又如何发送给GPS模块
为了方便用户选择,我们在上层做了一个供客户选择定位模式,
普通定位,SBAS定位,DGPS定位,以及串口波特率的设置,所以关于问题一有一个好的方法就是在原有的基础上(gps_qumu.c)增加一个进程
\hardware\libhardware_legacy\hc12a_gps\uart_a_b.c用来下发命令或者发送数据给GPS模块,因为是要由串口A发送命令给GPS模块以及配置串口B,所以要先初始化串口A
(附:串口A对应主控UART3,串口B对应主控UART1)
点击(此处)折叠或打开
- Java :
- public void setMode(int mode) {
- setModeNative(mode);
- }
- JNI:
-
- static void UARTARecivceModeCmd(JNIEnv *env,jobject clazz,jint cmd){
- LOGD("leilei:mode:%d",cmd);
- UART_A_Recivce_Mode_Cmd(cmd);
- //return 0;
-
- }
-
- static JNINativeMethod method_table[]={
- { "setModeNative","(I)V",(void*)UARTARecivceModeCmd},
- };
-
- int register_android_server_DGpsService(JNIEnv *env)
- {
- return jniRegisterNativeMethods(env, "com/android/server/DGpsService",
- method_table, NELEM(method_table));
- }
- HAL:
- int UART_A_Recivce_Mode_Cmd(int cmd)
- {
- 。。。。。。。
- UART_A_INIT(fd);
- switch(cmd)
- {
- case PPP_gps:
- 。。。。。
- break;
- case DGPS_gps:
-
- 。。。。。
- break;
- case SBAS_gps:
- 。。。。
- break;
- default:
- LOGD("default config!\n");
- break;
-
- }
- close(fd);
- return 0;
- }