在上一章节我们对传感器MPU6000做了一个解析,MPU6000所支持的协议是SPI。这一章节我们来解析GPS,GPS使用的是串口通信。这里我们着重讲解UBLOX的解析过程,并且会附带串口的解析说明。这一章节完了之后大家有兴趣可以尝试RTK的数据解析,对于RTK我在前面讲到过。
首先我们还是找到GPS的启动代码,GPS的启动在RCS文件中直接就是
从这里就可以看出来。首先我们还是来看device_name,这个参数是
目录下。很显然这里其实就是串口的名字。既然说到这里我们就来说说“/dev/ttys3”是如何注册到串口的吧。
还记的SPI的驱动吧。这里我们主控是V2板的所以是支持的处理器是stm32的,所以我们就到stm32的驱动中去找,这里一般对stm32库了解的话都知道,串口要么是usart要么是serial,这里我们就可以知道文件是stm32_serial.c,初始化串口程序就是up_serialinit了,至于为什么,你可以去追踪一下,发现这个函数在
然后一级一级的去追踪你就能发现最终的源头了。回到stm32_serial.c文件的初始那段代码去。你可以看到NSH 后台控制串口注册的是串口7
CONSOLE_UART=7哦,这里你可以去追踪哦,对照deconfig文件,那些define定义在deconfig文件能找到的。并且串口7还注册了DMA控制,接下来的for会对串口一一初始化看到没一开始是复制然后对x值进行改变然后注册了哦,刚才我们找到GPS是ttys3,所以我们查看一下uart_devs[2],这里面的逻辑应该不难理解吧!发现注册的是串口3。我们在来看看硬件的GPS接口
正好是串口3哦,这下对应起来了吧。串口的注册也就讲完了。
这里我们就直接进入start函数,这里的参数是相信也不难理解吧。然后就是产生驱动首先还是以new的方式进行初始,然后成功后进行init函数这里的init函数就是gps的init,这个自己理解一下,所以这个初始化也在本文件中,找到init函数看到的是串口任务同样去追中函数找到task_main函数,首先是打开串口这里的_port在new的时候赋完值了哦。然后就是订阅和初始化数据转存,然后进入while中去执行。首先会判断_fake_gps参数,这个是虚拟的数据,真正场合肯定不会用的,所以我们看else的,这里是一个case语句是对模块的选择,我们今天只讲ublox,所以看到这里也是new GPSDriverUBX.然后是检测配置主要是波特率,这里的configure是一个虚函数,我们使用的ublox所以当然是到ubx.cpp中去找了。这里面的函数都不难,但是要对比手册来看,这里面的处理机制可以值得学习哦,通过轮询的方式来查找ublox的波特率,还有就是配置ublox。
接下来就是复位那些数据了,然后就是要接收数据了。找到ublox的receive函数,进入读取串口数据读取的数据暂存在buf中。这里的read函数大家不妨去找找,这个是一个重载到gps.cpp中的回掉函数,大家也能看到读取数据的case语句这里面就有对串口数据中断读取的函数,大家自己去理解一下。
所以从这里就可以看出帧头以0xb5,0x62开头。第一个case就是判断是0xb5和是否为rtcm格式。
完成帧头后需要进行校验了,看到没校验是从第三个数据开始的哦,ublox采用的是校验和的然后得到2个数据的长度
这里的_rx_payload_length就是长度了。接着就开始解析相关数据了,这里我们只解析SVINFO信息
看到没通过之前接收到的_rx_msg来判断接收到的是什么数据。首先我们还是来看看ublox的SVINFO数据帧,
进入到解析函数就可以看到这些数据的解析了,这里不做过多说明,只要对照手册就很容易读懂,这帧数据主要是卫星高度角、信噪比了。
解析出数据后就要继续进行校验和了,从刚才ublox的数据帧也可以看出来校验和是占两个字符。
当然校验完成了后还是要解析其他的数据了,这里面就有NAV_PVT、NAV_POSLLH等等,这些数据帧你就看到了经纬度、高度,ecef坐标了,这些解析的就没必要说了吧。
所有的数据在这里就算是接收完了,完了之后当然是要发布出去给需要的机制去订制。
大家也行看到的是_report_gps_pos,其实这个不难理解,大家还记得那个new吗?找到ublox的new初始化你能找到原因的。到这里GPS的驱动就基本上是完成了。