Android平台下Gps软件跑不动,要怎么修改?
解决方案 »
- android Socket 超时问题
- 在BaseExpandableListAdapter下如何动态修改组名
- Android 能不能调用本地的微博客户端
- 关于android
- 如何用3.2创建一个手机模拟器?
- 子线程里调用方法返回值如何给UI线程?
- Android listview Item 监听事件
- 开机”Android“字样显示
- android开发一般都看哪些开发网站学习?应聘的话哪些网站上投简历比较靠谱?求大神门解答。。。
- Android 连接了一个C#编写的socket服务端,该服务端部署到了云服务器上,为什么这个socket服务端关闭了,socket客户端依然提示连接成功
- 设计一个安卓棋类游戏的界面?
- 线程再次start,崩?
01-02 00:38:22.490: INFO/ActivityManager(2156): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.chartcross.gpstestplus/.GPSTestPlus } from pid 2212
01-02 00:38:22.500: INFO/SurfaceFlinger(2156): mHw->getFormat() 4
01-02 00:38:22.540: INFO/ActivityManager(2156): Start proc com.chartcross.gpstestplus for activity com.chartcross.gpstestplus/.GPSTestPlus: pid=2506 uid=10040 gids={}
01-02 00:38:22.880: DEBUG/dalvikvm(2506): GC_EXTERNAL_ALLOC freed 61K, 52% free 2585K/5379K, external 716K/1038K, paused 87ms
01-02 00:38:22.960: DEBUG/AndroidRuntime(2506): Shutting down VM
01-02 00:38:22.960: WARN/dalvikvm(2506): threadid=1: thread exiting with uncaught exception (group=0x2aac0560)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): FATAL EXCEPTION: main
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): java.lang.RuntimeException: Unable to resume activity {com.chartcross.gpstestplus/com.chartcross.gpstestplus.GPSTestPlus}: java.lang.IllegalArgumentException: provider=gps
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.os.Looper.loop(Looper.java:123)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.ActivityThread.main(ActivityThread.java:3683)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at java.lang.reflect.Method.invokeNative(Native Method)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at java.lang.reflect.Method.invoke(Method.java:507)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at dalvik.system.NativeStart.main(Native Method)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): Caused by: java.lang.IllegalArgumentException: provider=gps
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.os.Parcel.readException(Parcel.java:1326)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.os.Parcel.readException(Parcel.java:1276)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:646)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:582)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:446)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at com.chartcross.gpstestplus.GPSTestPlus.onResume(GPSTestPlus.java:492)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.Activity.performResume(Activity.java:3832)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
01-02 00:38:22.960: ERROR/AndroidRuntime(2506): ... 12 more
01-02 00:38:22.990: WARN/ActivityManager(2156): Force finishing activity com.chartcross.gpstestplus/.GPSTestPlus
01-02 00:38:23.500: WARN/ActivityManager(2156): Activity pause timeout for HistoryRecord{2b2199b8 com.chartcross.gpstestplus/.GPSTestPlus}
01-02 00:38:33.600: WARN/ActivityManager(2156): Activity destroy timeout for HistoryRecord{2b2199b8 com.chartcross.gpstestplus/.GPSTestPlus}
Registers the current activity to be notified periodically by the named provider. Periodically, the supplied LocationListener will be called with the current Location or with status updates. It may take a while to receive the most recent location. If an immediate location is required, applications may use the getLastKnownLocation(String) method. In case the provider is disabled by the user, updates will stop, and the onProviderDisabled(String) method will be called. As soon as the provider is enabled again, the onProviderEnabled(String) method will be called and location updates will start again. The frequency of notification may be controlled using the minTime and minDistance parameters. If minTime is greater than 0, the LocationManager could potentially rest for minTime milliseconds between location updates to conserve power. If minDistance is greater than 0, a location will only be broadcasted if the device moves by minDistance meters. To obtain notifications as frequently as possible, set both parameters to 0. Background services should be careful about setting a sufficiently high minTime so that the device doesn't consume too much power by keeping the GPS or wireless radios on all the time. In particular, values under 60000ms are not recommended. The supplied Looper is used to implement the callback mechanism.Parameters
provider the name of the provider with which to register
minTime the minimum time interval for notifications, in milliseconds. This field is only used as a hint to conserve power, and actual time between location updates may be greater or lesser than this value.
minDistance the minimum distance interval for notifications, in meters
listener a {#link LocationListener} whose onLocationChanged(Location) method will be called for each location update
looper a Looper object whose message queue will be used to implement the callback mechanism. If looper is null then the callbacks will be called on the main thread. Throws
IllegalArgumentException if provider is null or doesn't exist
IllegalArgumentException if listener is null
SecurityException if no suitable permission is present for the provider.
http://www.linuxidc.com/Linux/2011-10/45371.htm
protected void getAndTraceLocation(){
//geocoder = new Geocoder(this, Locale.getDefault());;
geocoder = new Geocoder(this, Locale.ENGLISH);;
// Acquire a reference to the system Location Manager
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
if(provider!=null){
Log.i(TAG, "GPS provider is enabled:" + provider.toString());
// Get the location
latestLocation = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(latestLocation);
// Register the listener with the Location Manager to receive location
locationManager.requestLocationUpdates(provider, 1000, 5, locationListener);
}else{
Log.i(TAG, "No GPS provider found!");
updateWithNewLocation(null);
}
} protected void getAndTraceLocation(){
//geocoder = new Geocoder(this, Locale.getDefault());;
geocoder = new Geocoder(this, Locale.ENGLISH);;
// Acquire a reference to the system Location Manager
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = locationManager.getBestProvider(criteria, true);
if(provider!=null){
Log.i(TAG, "GPS provider is enabled:" + provider.toString());
// Get the location
latestLocation = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(latestLocation);
// Register the listener with the Location Manager to receive location
locationManager.requestLocationUpdates(provider, 1000, 5, locationListener);
}else{
Log.i(TAG, "No GPS provider found!");
updateWithNewLocation(null);
}
}Java代码
protected final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
Log.i(TAG, "location changed to: " + location);
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
}; protected final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
Log.i(TAG, "location changed to: " + location);
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
}; 需要注意的是:这里的locationManager.getBestProvider(criteria, true) 之后,必须进行是否为null的判断,否则在终端禁用GPS和网络以后会出现NPE异常。 注意这里回调了一个通用的updateWithNewLocation(latestLocation)方法,用户只要实现这个方法,即可实现第二个关键点,即“建立合理刷新机制”。 下面是最简单的例子: Java代码
@Override
protected void updateWithNewLocation(Location location) {
super.updateWithNewLocation(location);
String location_msg = context.getString(R.string.msg_no_gps);
if (location != null) {
location_msg = location.getLatitude() + "," + location.getLongitude();
Log.i(TAG, location_msg);
} else {
Log.i(TAG, location_msg);
}
location_msg = String.format(_location_msg, location_msg);
_location.setText(location_msg);
} @Override
protected void updateWithNewLocation(Location location) {
super.updateWithNewLocation(location);
String location_msg = context.getString(R.string.msg_no_gps);
if (location != null) {
location_msg = location.getLatitude() + "," + location.getLongitude();
Log.i(TAG, location_msg);
} else {
Log.i(TAG, location_msg);
}
location_msg = String.format(_location_msg, location_msg);
_location.setText(location_msg);
}
完毕!
http://blog.chinaunix.net/space.php?uid=25369701&do=blog&id=125329
http://www.eoeandroid.com/thread-71032-1-1.html
http://www.51x86.com/chongzi865458/blog/11-10/232233_27807.htmlAndroid GPS架构分析
http://www.51x86.com/chongzi865458/blog/11-10/232232_50018.html#articletop
(1)制作libgps.so库
google提供的方法
http://source.android.com/porting/gps.html
Android.mk:
LOCAL_SRC_FILES:= main.c //指定库的源码
LOCAL_MODULE := libgps //指定库的名称
include $(BUILD_SHARED_LIBRARY) //指定编译成.so库
(2)修改BoardConfig.mk
添加BOARD_GPS_LIBRARIES := libgps
由于hardware/libhardware_legacy/gps/Android.mk中指定LOCAL_SHARED_LIBRARIES
ifneq ($(BOARD_GPS_LIBRARIES),)
LOCAL_CFLAGS += -DHAVE_GPS_HARDWARE
LOCAL_SHARED_LIBRARIES += $(BOARD_GPS_LIBRARIES)
endif
(3)修改hardware/libhardware_legacy/gps/gps.cpp
static voidgps_find_hardware( void ){ sGpsInterface = gps_get_hardware_interface(); if (!sGpsInterface) LOGD("no GPS hardware on this device\n");}gps_get_hardware_interface()在libgps.so源码中实现
(4)实现libgps.so源码main.c
(可参考hardware/libhardware_legacy/gps/gps_qemu.c)
static const GpsInterface sirfGpsInterface = { sirf_gps_init, sirf_gps_start, sirf_gps_stop, sirf_gps_cleanup, sirf_gps_inject_time, sirf_gps_inject_location, sirf_gps_delete_aiding_data, sirf_gps_set_position_mode, sirf_gps_get_extension,};const GpsInterface* gps_get_hardware_interface(){ return &sirfGpsInterface;}下面将介绍下需要修改的函数,其他函数都可以仿照gps_qemu.csirf_gps_start()函数中添加SiRF_Start();sirf_gps_stop()函数中添加SiRF_Stop();sirf_gps_init()函数中调用gps_state_init,作用是创建socket通信和gps_state_thread线程;gps_state_init()函数中需要根据具体的GPS模块实现state->fd = channel_open();gps_state_thread()函数中去掉两句nmea_reader_set_callback调用;nmea_reader_parse()函数添加callbacks.nmea_cb和callbacks.location_cb:if (r->pos < 9) { D("Too short. discarded."); return;}{ struct timeval tv; gettimeofday(&tv, NULL); _gps_state->callbacks.nmea_cb(tv.tv_sec*1000+tv.tv_usec/1000, r->in, r->pos);}nmea_tokenizer_init(tzer, r->in, r->in + r->pos);
if (_gps_state->callbacks.location_cb) { _gps_state->callbacks.location_cb( &r->fix ); r->fix.flags = 0;}else { D("no callback, keeping data until needed !");}(5)NMEA数据上报Android本身的GPS读取NMEA信息机制是调用read函数读取串口信息并解析上报,但SIRF提供了SiRF_Output函数用于底层与应用层的数据上报,GPS工作后会有线程不停调用SiRF_Output,因此只要在SiRF_Output函数中添加:NmeaReader reader[1];nmea_reader_init( reader );for (nn = 0; nn < sizeof(buf); nn++) nmea_reader_addc( reader, buf[nn] );现在GPS可以上报GGA、GSA、RMC等数据(GSA数据需添加nmea_reader_parse函数中关于GSA数据解析) 后面还会继续研究GSA等数据的解析上报...期待o ^-^
1,确保GPS数据采集到了,看串口
2,framework正确的开启location GPS服务
3,写个测试程序测试下
http://blog.chinaunix.net/space.php?uid=25369701&do=blog&id=118662
TI平台使用SIRF GPS
1.底层驱动的实现
GPS厂商提供的库通过echo sysfs的方式控制gps的onoff和reset,这需要linux实现GPS的sysfs模型驱动,在driver文件夹中增加gps.c文件
(1)填充一个bin_attribute的结构体,驱动加载后就会在系统的/sys/module目录下创建sirf文件 static struct bin_attribute sirf_mode_attr = { .attr = { .name = "sirf", .owner = THIS_MODULE, .mode = S_IRUGO | S_IWUGO, }, .size = 0, .read = readcmd, .write = writecmd, };(2)probe函数
static int __init gps_probe(struct platform_device *pdev){ int ret; ret = sysfs_create_bin_file(&(module_kset->kobj), &sirf_mode_attr); if (ret) { printk(KERN_ERR "<SiRF> Failed to create sys file\n"); return -ENOMEM; } return 0; }(3)remove函数static int __init gps_remove(struct platform_device *pdev){ sysfs_remove_bin_file(&(module_kset->kobj), &sirf_mode_attr); return 0;}(4)平台驱动的注册static struct platform_driver gps_driver = { .probe = gps_probe, .remove = gps_remove, .driver = { .name = "gps", },};static int __init gps_init(void){ return platform_driver_register(&gps_driver);}static void __exit gps_exit(void){ platform_driver_unregister(&gps_driver);}late_initcall(gps_init);module_exit(gps_exit);(5)write和read函数(read暂时为空,没有用到)static ssize_t readcmd(struct kobject *kobj, struct bin_attribute *attr, char *buf, loff_t off, size_t count){}static ssize_t writecmd(struct kobject *kobj, struct bin_attribute *attr, char *buf, loff_t off, size_t count) { char *tail; int op; op = simple_strtol(buf, &tail, 10); switch(op) { case 1: case 2: break; case 3: printk(KERN_BUG "<SiRF> Chip running...\n"); set_power_on(); run_mode = RUN_MODE; break; case 4: printk(KERN_BUG "<SiRF> Chip stopped...\n"); set_power_off(); run_mode = STOP_MODE; break; case 5: printk(KERN_BUG "<SiRF> Chip reset on high...\n"); set_reset(1); break; case 6: printk(KERN_BUG "<SiRF> Chip reset on low...\n"); set_reset(0); break; default: printk(KERN_BUG "<SiRF> Unknown operation %d\n", op); break; } return count; }现在通过echo number > /sys/module/sirf就能控制GPS的power on/off和reset。
http://blog.chinaunix.net/space.php?uid=25369701&do=blog&id=116109
最近在TI平台上调试GPS模块,收集到一些资料:
1.Android GPS架构分析-preview
2.Android GPS架构分析一
3.Android GPS架构分析二
4.Android GPS架构分析三
5.Android GPS架构分析四
6.Android GPS架构分析五
7.Android GPS架构分析(gps启动过程图)
8.Android GPS
应该是没开启location GPS服务
framework GPS部分还是有一点BUG需要修改的
你的Android是那个版本?我的是2.3,2.2的整个框架已经有了几乎不需要调试,但2.3框架还没搭好,估计还要自己去完善这个框架!
追下代码 应该可以pass 的
几个主要的文件及目录:frameworks/base/location/* (client部分)frameworks/base/core/jni/android_location_GpsLocationProvider.cpp (JNI 部分)frameworks/base/services/java/com/android/serverLocationManagerService.java(server 部分)hardware/libhardware_legacy/gps/* (hardware 接口部分) 一是:控制通道,也就是由app层发起的比如enable或disable的控制命令。example代码调用LocationManager.java ,再通过IPC来实现真正的调用。LocationManager.java 主要负责通信。具体的实现在LocationManagerService.java中。接口文件是ILocationManager.aidl。在service中根据provider来创建了一个GpsLocationProvider.java,并通过JNI调 android_location_GpsLocationProvider.cpp,该文件再通过GPSInterface来调用硬件的具体实现代码。二是: enable后的Location数据和状态上报。对于数据的上报过程,主要就是关注几个callback函数。主要代码分析如下:在 GpsLocationProvider.java文件中enable()一个GpsLocationProvider时,会启动一个 GpsEventThread,该线程主要就是调用了native_wait_for_event();通过JNI调用到了 anroid_location_GpsLocationProvider.cpp中的 android_location_GpsLocationProvider_wait_for_event();而该event的触发是由来自硬件驱动 Location数据包的上报,底层的硬件驱动程序会把raw gps data通过pipe或其他的方式,送出来,这个要看gps驱动的实现了,我们通过自己实现的GpsInterface 来解析raw gps data并调用loaction_callback()来触发event并copy Location数据,等待到event后再调用GpsLocationProvider.java中的reportLocation()上报Location. 除了框架代码外,我们自己需要实现的代码也分为两块,一个是app层的代码,app层我也提供一个简单的代码例子,请参考以下代码:public class LocationSample extends Activity implements LocationListener { private LocationManager lm; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,1l,1l,this); } public void onLocationChanged(Location location) { // TODO Auto-generated method stub Log.d(TAG,"location: "); } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub Log.d(TAG,"provider disable"); } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub Log.d(TAG,"provider enable"); } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub Log.d(TAG,"status changed"); }}另外一部分就是hardware/libhardware_legacy/gps 部分的实现,这个主要就是实现一个gps.h里面的几个数据结构:typedef struct { gps_location_callback location_cb; gps_status_callback status_cb; gps_sv_status_callback sv_status_cb;} GpsCallbacks; typedef struct { int (*init)( GpsCallbacks* callbacks ); int (*start)( void ); int (*stop)( void ); void (*set_fix_frequency)( int frequency ); void (*cleanup)( void ); int (*inject_time)(GpsUtcTime time, int64_t timeReference, int uncertainty); void (*delete_aiding_data)(GpsAidingData flags); int (*set_position_mode)(GpsPositionMode mode, int fix_frequency); const void* (*get_extension)(const char* name);} GpsInterface; typedef struct { uint16_t flags; double latitude; double longitude; double altitude; float speed; float bearing; float accuracy; GpsUtcTime timestamp;} GpsLocation;在GpsInterface->init()的时候要把上层的GpsCallbacks传进来,然后start后,从驱动那里poll获得gps raw data,并对raw data进行解析并填充GpsLocation数据结构,然后调用location_cb 上报location 数据。 //初始化的时候,得到GpsInterface,调用init, static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj) { if (!sGpsInterface) sGpsInterface = gps_get_interface(); return (sGpsInterface && sGpsInterface->init(&sGpsCallbacks) == 0); } GpsCallbacks sGpsCallbacks = { location_callback, status_callback, sv_status_callback, }; //并且打开串口,注册sGpsCallbacksqemu_gps_init(GpsCallbacks* callbacks) ----> GpsState* s = _gps_state; ----> gps_state_init(s); ----> s->callbacks = *callbacks; //打开串口,创建线程gps_state_init( GpsState* state ) -----> state->fd = qemu_channel_open_gps -----> pthread_create( &state->thread, NULL, gps_state_thread, state ) static void location_callback(GpsLocation* location) { pthread_mutex_lock(&sEventMutex); sPendingCallbacks |= kLocation; memcpy(&sGpsLocation, location, sizeof(sGpsLocation)); pthread_cond_signal(&sEventCond); //同步西面的函数 pthread_mutex_unlock(&sEventMutex); } //下面这个函数就是由上层的 java调用的,并且等待底层的硬件发送数据,其中由EventCond同步static void android_location_GpsLocationProvider_wait_for_event(JNIEnv* env, jobject obj) { pthread_mutex_lock(&sEventMutex); pthread_cond_wait(&sEventCond, &sEventMutex); // copy and clear the callback flags int pendingCallbacks = sPendingCallbacks; sPendingCallbacks = 0; // copy everything and unlock the mutex before calling into Java code to avoid the possibility // of timeouts in the GPS engine. memcpy(&sGpsLocationCopy, &sGpsLocation, sizeof(sGpsLocationCopy)); memcpy(&sGpsStatusCopy, &sGpsStatus, sizeof(sGpsStatusCopy)); memcpy(&sGpsSvStatusCopy, &sGpsSvStatus, sizeof(sGpsSvStatusCopy)); pthread_mutex_unlock(&sEventMutex); if (pendingCallbacks & kLocation) { env->CallVoidMethod(obj, method_reportLocation, sGpsLocationCopy.flags, (jdouble)sGpsLocationCopy.latitude, (jdouble)sGpsLocationCopy.longitude, (jdouble)sGpsLocationCopy.altitude, (jfloat)sGpsLocationCopy.speed, (jfloat)sGpsLocationCopy.bearing, (jfloat)sGpsLocationCopy.accuracy, (jlong)sGpsLocationCopy.timestamp); } if (pendingCallbacks & kStatus) { env->CallVoidMethod(obj, method_reportStatus, sGpsStatusCopy.status); } if (pendingCallbacks & kSvStatus) { env->CallVoidMethod(obj, method_reportSvStatus); } if (pendingCallbacks & kXtraDownloadRequest) { env->CallVoidMethod(obj, method_xtraDownloadRequest); } if (pendingCallbacks & kDisableRequest) { // don't need to do anything - we are just poking so wait_for_event will return. } } //hardware 那部分有个线程gps_state_thread 一直在读串口的内容并进行解析,最后解析到location的信息由cpp文件的GpsCallbacks sGpsCallbacks = { location_callback....}同步上层的线程 gps_state_thread ----->nmea_reader_addc ----->nmea_reader_parse ------> location_callback ------->数据上报
http://www.linuxidc.com/Linux/2011-09/42454.htm