浙江工业大学本科毕业设计论文
hardware/libhardware_legacy/include/hardware_legacy/gps.h
通过查看文件,发现源码包里面 hardware/libhardware_legacy 目录里面没 GPS 文件夹。所以需要在 hardware/libhardware/modules/ 下创建一个 GPS 文件夹, 在 hardware/libhardware_legacy/ 这下面也同样,同时修改 Android.mk 就可以了。
修改 hardware/libhardware/ 下的 Android.mk 文件
include $(addsuffix /Android.mk, $(addprefix $(LOCAL_PATH)/, \\ modules/gralloc \\ modules/gps \\ tests \\ ))
把GPS文件夹包含的编译文件里面。由于 android 模拟器有模拟 GPS 的源码。把gps_qemu.c 文件 COPY 到 刚刚创建的 GPS 文件夹内。同时创建一个Android.mk文件。 Android.mk 文件如下: LOCAL_PATH := $(call my-dir)
# HAL module implemenation, not prelinked and stored in
# hw/
LOCAL_PRELINK_MODULE := false LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware LOCAL_SRC_FILES := \\ gps_qemu.c
LOCAL_MODULE := gps.default
#LOCAL_CFLAGS:= -DLOG_TAG=\\\ifeq ($(BOARD_NO_PAGE_FLIPPING),true) LOCAL_CFLAGS += -DNO_PAGE_FLIPPING
39
浙江工业大学本科毕业设计论文
endif
include $(BUILD_SHARED_LIBRARY)
下一步就是 gps_qemu.c 的修改,首先是gps_state_init 打开串口设备: state->fd = open(gps_Serial_Name, O_RDONLY );这里打开串口,gps_Serial_Name 这根据已有设备查找对应串口的设备节点,这里的设备节点是‖/dev/s3c2410_serial1‖。 设置串口事件:
// disable echo on serial lines if ( isatty( state->fd ) ) { struct termios ios; tcgetattr( state->fd, &ios );
ios.c_lflag = 0; /* disable ECHO, ICANON, etc... */
ios.c_oflag &= (~ONLCR); /* Stop \\n -> \\r\\n translation on output */
ios.c_iflag &= (~(ICRNL | INLCR)); /* Stop \\r -> \\n & \\n -> \\r translation on input */
ios.c_iflag |= (IGNCR | IXOFF); /* Ignore \\r & XON/XOFF on input */ cfsetispeed(&ios, B9600); cfsetospeed(&ios, B9600);
tcsetattr( state->fd, TCSANOW, &ios ); }
这一步非常重要,如果没有这一步,那么在 GPS HAL 线程里面不会接收串口数据。同时要在gps_qemu.c中增加设置串口所需要的头文件,否则会编译出错。这样 Android 的 HAL 层于串口就接通了。接下来就是解析串口数据,由于模拟器里面已经有解析 RMC 的GPS结构。所以直接测试就可以了。直接测试后发现当有 GPS 数据调用 CALLBACK 函数。 if (r->callback) {
r->callback( &r->fix ); r->fix.flags = 0;
40
浙江工业大学本科毕业设计论文
}
但是此时 android 重启了,查询网上资料后发现主要是创建线程的问题。 把创建线程的函数换一下就可以了。 /*
if ( pthread_create( &state->thread, NULL, gps_state_thread, state ) != 0 ) { LOGE(\ goto Fail; } */
state->thread = state->callbacks.create_thread_cb(\ gps_state_thread, state);
但是这样改完之后生成so文件导入开发板,发现一直重启。经过调试发现:在2.2时 static void gps_state_init( gpsState* state )函数中gps_qemu.c有 if ( pthread_create( &state->thread, NULL, gps_state_thread, state ) != 0 ) { LOGE(\ goto Fail; }
由于2.3系统不会轮询查看是否创建线程,因此会导致JNIEnv* env = AndroidRuntime::getJNIEnv();这句回去获取创建线程,不用回调函数把线程传上去,上层不知道有这个线程,JNIEnv* env == NULL ,所以这是把数据传上去时就出问题了,可能会遇到的现象是系统不断重启,所以要修改。 首先:
static int qemu_gps_init(gpsCallbacks* callbacks) {
gpsState* s = _gps_state; s->callbacks = *callbacks; if (!s->init)
gps_state_init(s); return 0;
41
浙江工业大学本科毕业设计论文
}
把那 s->callbacks = *callbacks;放到gps_state_init(s);前面去,要先给接口在用回调函数上传线程。将改完的gps_qume.c用Android.mk编译生成gps.default.so,放入开发板的/system/lib/hw下,重启开发板之后就可以了。
6.3 串口及GPS应用程序运行结果
6.3.1 android上的串口测试程序
测试使用的api是android-serialport-api,可以android的官网下载源码,在
6410开发板提供的android源码中编译后放入开发板既能运行。
下面是在串口1中接上GPS模块之后收到的数据信息图:
图6-3 串口设置
42
浙江工业大学本科毕业设计论文
图6-4 串口收到的数据
从上图可以看出,GPS模块运行正常,串口正常。
6.3.2 自编简单GPS应用程序演示
程序代码见附录。
这是一个简单的自编android测试程序,经过多次调试后终于能在开发板上跑了,虽然不是很完善,但还是能作为简单演示。 在6410开发板android系统上运行结果:
图6-5 GPS经纬度接受测试
43
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库车载卫星定位导航系统设计 - 图文(10)在线全文阅读。
相关推荐: