自己写的NMEA0183的C语言文件,第一个结构体是卫星的基本信息,多个卫星就创建多个实例。第二个结构体是当前定位信息,只要一个实例就够了。接口函数有几个,简单说明一下:
1.Clear函数。在其他单片机中这个函数不是必须的,但是T5L的xdata数据只能声明不能再初始化之前赋值,所以用这个Clear当作清零和赋初始值用;
2.Data函数。收到的所有数据都往这里扔,会自动分类并解析。
3.GetXX:需要取得哪个系统的信息就调用哪个函数,这里只包括四种:GPS、北斗、格洛纳斯和伽利略,其他的没什么用就不要了。
4.GetGNSS:得到当前的定位信息,经纬度和时间等。
再来看看各个解析数据的实现方法,Clear就不说了:
1.判断数据头是哪种数据,GNGSA、GNRMC、GAGSV、BDGSV、GLGSV、GPGSV,有用的是这些,GNGGA是定位的类型,用不到也可忽略;
2.根据得到的数据类型再分别按照协议的格式解析出每个字段的值。由于xxGSV有可能一批数据分几包发送过来,所以最简单的方法就是以GPGSV为本批数据开始,中间收到的各种xxGSV数据根据上面提到的四种系统分别累计,最后以GNRMC为本批数据结束,此时就可以得到完整的定位信息和卫星信息了。
3.获取定位信息或者得到指定卫星系统的信息,直接调用GetXX即可。为了防止读写同时进行的死锁,建议在解析完RMC数据后再进行,如果双缓冲区更好。
每次获取数据只在处理完完整的数据后再进行其他的操作,提前获取也没什么意义。Air551G默认一秒钟输出一次全部数据,所以每秒钟更新一次界面上的图表数据。
至此,和定位相关的程序完成。
二、迪文屏T5L的单片机开发及显示控制:
迪文T5L屏分为许多型号,我申请到的是DMG85480F050_01WTC,5寸的电容屏,分辨率为480x854,默认竖屏显示。迪文屏其实就是个串口屏,可以通过发送各种指令在屏幕上显示不同的东西。不过,一般的串口屏需要外接一个单片机来作为主控,所有的逻辑操作或外设的驱动都要在这个单片机中来完成,屏幕也只是个外设而已。迪文屏的屏内芯片是一个双核的51单片机,其中一核专用于接收指令显示对应内容,经过优化后显示速度很快,用户不能直接操作此核;另外一核就是用户可操作核,自己写的程序可以烧写到这个核内来执行,所以不需要再外接单片机了。虽然是C51的内核,但是频率已经提高到了206M,不管是用户的程序还是屏幕的显示,运行起来非常迅速,没有卡顿。
迪文屏开发起来说简单也简单,说复杂也挺复杂的,规则比较多,图片文件编号、显示控件文件编号、触摸控件文件编号、字库文件编号等都有具体的规定,不能错。好在迪文提供了相关的开发工具,能够省去一些制作上的麻烦。先来看一下效果:
简单的模拟660RTK,所以东西不多,背景图+柱状图显示,柱状图是动态画上去的,数据来源就是定位模块提供的串口数据,解析后得到的结果。那么,迪文屏这边的开发又分为两个部分:界面的静态显示及动态数据的显示和C51程序逻辑及外设控制。
1.界面的静态显示:
首先要做好一张背景图片,为了简单起见,所有的网格线都做再图片中而不是用程序或控件画出来,这样可以免去反复调试的麻烦。
如图,四个定位系统区分开了,每个部分只显示对应的系统,没有显示说明没有这个系统的卫星信息,更加直观。每种系统用不同颜色来显示,一目了然。红色北斗、蓝色GPS、黄色格洛纳斯、绿色伽利略,再图例中加以说明。图片的大小就是屏幕分辨率的大小,480x854。
迪文提供了制作显示界面的工具DWIN DGUS,首先用这个工具建立一个新工程,把刚才做好的背景图片导入进来,背景图片的文件名要以0为开头,后面任意。导入后增加显示的控件。柱状图是动态画上去的,使用“基本图形显示”这个控件来指定可画图的范围。每个控件可以显示多种图形,如点、线、面等,但一个控件同一时刻只能显示一种,比如这次画点,那么这个控件上这一次只能画点,虽然能显示许许多多的点,但是想要改成线就只能清除后再次画线,不能并存。多个同种图形的颜色可以分别指定。
回到这个程序,想在不同的地方画图,我使用了四个控件,其实一个大的控件也可以,因为实际画图的坐标是绝对坐标而不是相对坐标,也就是坐标的原点是屏幕的0,0而不是控件的0x0。用一个大的控件反而更容易理解一些,不过已经做出来了就懒得改了,一样的。四个控件要指定四个不同的变量地址,程序中控制画图的时候要指定在哪个控件上画需要这个变量地址。
界面设计完成后,点击“生成”按钮可以自动产生烧写用到的屏幕相关的文件,0CNR.icl背景文件、13TouchFile.bin触控文件、14ShowFile.bin显示文件、22_Config.bin界面配置文件还有T5LCFG.CFG屏幕配置文件。模拟程序还没有做完,后面再显示卫星数据的话,还需要增加字库文件。
2.C51程序的外设控制:
同其他的51单片机一样,迪文T5L的外设种类也很少,只有IO口、串口、定时器、看门狗等,其他的比如I2C、SPI什么的都需要软件模拟来实现,不过T5L多了个CAN口,在组区域网的时候还是很实用的,只是我这个程序用不到。为了开发方便,我同样封装了一下,在使用时就不需要再查看寄存器了。
还没有写完,用到的时候随时补充。迪文T5L有4个串口,比一些小单片机用起来爽多了。不过注意一下,串口2如非必要最好保留,后续烧写程序时可能会用到。代码的实现就不细说了,有例程可以参考。
3.动态数据的显示:
前面说过柱状图是动态画上去的,现在就要用程序来控制画图,并使“基本图形显示”控件显示出来。
代码非常非常简单,就是定了一个结构体,每个结构体的实例是一个图形的起始坐标和结束坐标,再加上一个颜色。按照定位系统分成四类,每类的结束坐标的Y轴是固定的,开始坐标的Y根据信号强度计算出来;每一个柱状图的起始X和结束X,根据卫星编号计算出结果。有几颗卫星就生成几个实例,然后把这些数据组成图形显示的数据发送给屏幕。
读屏和写屏有专用的函数,ReadVP和WriteVP,指定控件的自定义地址,再把刚才拼成的实例数据当成参数传进来,写就是了,速度很快。
4.C51程序的逻辑控制:
逻辑控制就更简单了,把上面那几项功能串起来而已。
当每一批的定位数据收全后,分别获取北斗、GPS、格洛纳斯和伽利略四种系统的卫星信息,遍历每一个信息并调用计算图形的函数,最后写入屏幕,完成。
代码和界面都做完了,现在要编译一下C51的程序,生成hex文件。不过烧写的时候需要的是bin文件,所以要先转换一下。迪文提供的转换工具,每次都要手动点一下,次数多了感觉有点麻烦,还是自动完成的好,一个批处理解决。
首先再工程文件夹下新建一个文件夹,名称随意,我这里叫Release,批处理文件中使用command命令进入这个文件夹,删除之前转换好的文件,再调用一下srec_cat.exe这个转换工具,并指定输出的文件名。保存后,再在Keil里设置为每次编译后执行,就会把hex文件自动转换后放入Release文件夹里,省去了手动的操作。
准备烧写。烧写就更麻烦了,由于我申请的这个屏幕是所谓的“标准品”,我的理解就是样品,功能还不是很完善,烧写的时候要将所有用到的文件拷贝到TF卡上,再插入屏幕的转接板上电来烧写。同样次数多了就感觉很烦,目前还不能用串口来烧写,不过迪文的工程师已经再做了,期待ISP工具。