赞
踩
哎呀呀,终于研究通透了MMDVM的串口屏相关了。
MMDVM默认对接的是Nextion屏幕。但是有人跟我说,NXT的屏幕和国内陶晶驰的屏幕就是一个东西,只不过ROM不一样。
至于Nextion和陶晶驰到底背后有啥PY关系,我们就不管了。但是我就知道,虽然HMI文档不能跨品牌直接打开,但这俩设计软件几乎长一样,手工画图移植GitHub上的工程就行
1、陶晶驰wiki:
http://wiki2.tjc1688.com/start/index.html
2、陶晶驰设计软件-USART HMI
http://wiki2.tjc1688.com/start/download_ide.html
3、NXT设计软件NextionEditor
https://nextion.tech/nextion-editor/
4、逗老师手绘的工程文件
https://github.com/ytlzq0228/Nextion_Fw_Update
学画串口屏之前,先别急,我们先搞明白MMDVM与串口屏的通信原理
MMDVM在运行过程中,会通过串口向串口屏幕发送对应的指令。包括文本更新指令和屏幕切换指令
如上图所示,在编辑HMI文件的时候,我们可以看到页面的文本框的编号t0 t1 txxx,MMDVM通过串口向屏幕发送指令,即可更新文本框中的文本内容。
这些编号与MMDVM的Nextion Display模块的各个字段名称一一对应。这些字段名称的含义在两个地方可以找到:
例如,需要更新TX发送频率,MMDVM会向屏幕发送指令
t32.txt="439.600Mhz"
屏幕上t32文本框则会显示MMDVM发送过来的文本内容,如下图所示
串口屏幕一般情况下会具备如下几个页面,包括主页面,DMR、YSF等各种制式的通信页面。
在需要切换页面的时候,MMDVM会通过串口发送下述命令。
注意,这些页面名称基本写死了,所以在自定义屏幕HMI的时候,需要创建相同名称的页面,但是无所谓页面ID,MMDVM并不会以ID进行page更新指令。
page MMDVM
page DMR
在后面开发HMI工程,以及参考GitHub上的各种工程时,发现除了上面两种显性指令以外,MMDVM还具有几个隐性指令
每次更新完成任意指令之后,MMDVM一定会在当前页面点击一次S0触控热区,关于触控热区,属于串口屏上一个透明的触摸按钮。所以对于需要在串口屏上进行数据处理的动作,可以写在S0的触摸动作里。
在page MMDVM页面,有一个status变量,此变量很有意思,存储的是MMDVM更新状态代码。MMDVM在更新不同的字段内容之后,会将代码赋予不同的值。例如64代表刚刚更新过的是DMR TS1的呼号,72代表刚刚更新过DMR TS2的呼号
page MMDVM的status状态码在https://github.com/g4klx/MMDVMHost/blob/master/Nextion.cpp里面声明的
关于上述两个隐藏指令的功能,后面讲到HMI工程开发的时候会具体说明。
支持触摸操作的串口屏幕,在触摸动作发生之后,会按照配置通过串口发送相应指令。如下图所示
如果使用NextionDriver,其会侦听串口,并在侦听到指令之后执行相应的动作。
关于NextionDriver可以响应的串口指令如下:
Sending commands from the display
例如上图的2A FB 02 FF FF FF
对应的动作即为显示UserDB更新时间
如果不使用NextionDriver,MMDVM直连串口屏,有两种方式:
由于安装双工热点版之后占用了树莓派上唯一的一个板载异步串口,所以在使用热点板的情况下,只能选择第二种方式进行通信。
两种通信方式的主要区别是,使用树莓派板载串口,可以使用115200波特率高刷通信(),使用modem串口,只能以9600波特率通信。
如果使用NextionDriver,MMDVM侧选择使用dev/ttyNextionDriver这个虚拟串口,NextionDriver选择实际使用的物理串口。
可能很多朋友有误会,认为使用串口屏一定要安装NextionDriver驱动。其实不是的
如前文所说,NextionDriver的主要功能和特点是:
不装该项目也行,不是必选,但是有些字段不传递
https://github.com/on7lds/NextionDriver
https://on7lds.net/42/
https://github.com/on7lds/NextionDriverInstaller
NextionDriver的参数本身也位于 MMDVM 配置文件的额外部分 [NextionDriver]中(MMDVM.ini 或 PiStar 上的 /etc/mmdvmhost)
配置字段含义参考https://github.com/on7lds/NextionDriver/blob/master/README-options.md
关注其中的Nextion_ON7LDS和Nextion.cpp
https://github.com/g4klx/MMDVMHost
https://github.com/g4klx/MMDVMHost/blob/master/Nextion.cpp
Nextion.cpp中可以看到原始传递给Nextion的字段内容
L3 Layout模式下传递的字段说明:
https://github.com/g4klx/MMDVMHost/blob/master/Nextion_ON7LDS/README-L3
关于L2和L3两个布局的区别,L2传递字体、颜色各种信息,强约束屏幕布局。L3只传递文本内容,自定义屏幕建议使用L3的布局字段进行开发。
https://github.com/on7lds/NextionDriver/tree/master/Nextion
这几个HMI工程很具有参考意义
后面有关于代码的问题,可以先去看官方wiki,上面啥都有
http://wiki2.tjc1688.com/start/index.html
后文的教程,可以参考逗老师最近创建的一个工程文件
示例MMDVM串口屏HMI工程文件
page MMDVM为待机界面,名称一定要是"MMDVM"
名称一定要是DMR和YSF
以YSF页面为例
前文所说,MMDVM在更新任意一条指令之后,都会去点击一下S0按钮,所以我们可以在S0的点击动作里面去写一些复杂操作。
同时,还记的前面说的MMDVM.status这个全局变量么,MMDVM.status=84的时候,代表刚刚更新过的是YSF通联的相关字段。
所以,如果想记录通联历史,在当S0被按下且MMDVM.status=84的时候,把当前YSF页面需要存储的字段,赋值给下面的txbis文本上,并以此循环赋值,是不是就可以实现历史记录保存功能了呢
if(MMDVM.status.val==84) { if(t0bis1.txt!=t0.txt) { if(t0bis1.txt!="") { t0bis7.txt=t0bis6.txt t2bis7.txt=t2bis6.txt t200bis7.txt=t200bis6.txt t0bis6.txt=t0bis5.txt t2bis6.txt=t2bis5.txt t200bis6.txt=t200bis5.txt t0bis5.txt=t0bis4.txt t2bis5.txt=t2bis4.txt t200bis5.txt=t200bis4.txt t0bis4.txt=t0bis3.txt t2bis4.txt=t2bis3.txt t200bis4.txt=t200bis3.txt t0bis3.txt=t0bis2.txt t2bis3.txt=t2bis2.txt t200bis3.txt=t200bis2.txt t0bis2.txt=t0bis1.txt t2bis2.txt=t2bis1.txt t200bis2.txt=t200bis1.txt } t0bis1.txt=t0.txt t2bis1.txt=t2.txt t200bis1.txt=t200.txt } }
如果使用NextionDriver,其会侦听串口,并在侦听到指令之后执行相应的动作。
关于NextionDriver可以响应的串口指令如下:
Sending commands from the display
例如上图的2A FB 02 FF FF FF
对应的动作即为显示UserDB更新时间。
如果发送的指令格式是
2A F1 (linux command) FF FF FF
则可以在树莓派上执行任意Linux指令,并将运行结果的第一行返回给msg.txt
例如:
这是一个比较有意思的操作。由于树莓派上只有一个异步串口,并且连接了热点版。所以目前绝大部分朋友的串口屏,都是从热点版上的NXT接口扩展出来的,这个NXT接口是经由热点版的STM32单片机的异步串口透传来自主机端的指令,主机端选择Nextion设备接口为modem,说是透传,但是接在热点版上的串口屏确实了两个功能:
既然这样,咱就开始整活呗。I2C总线上反正能挂一堆设备,有没有设备能把I2C转成USART的。我日哦,还真有。
SC16IS752芯片,用于在I2C总线上挂一个设备,并转出两路USART异步串口+8路GPIO,而且树莓派OS内核已经包含了SC16IS752的驱动,拿来就能直接用,骚不骚。
SC16IS752的产品,微雪有一款模块,大家伙可以去找找。同时淘宝直接搜,还有一款紫色的体积更小的模块,只要15块钱左右,大家自己搜搜,我就不贴链接了。
如上是接口定义,一看就懂。
最后的效果就是贼爽,不管多少块屏幕,一组I2C总线搞定
对于做好的TFT工程文件,常见的办法是卡刷,确实比较简单。
但是热点盒子要卡刷屏幕文件,要拆机才能刷,不够优雅。
如果你已经实现了进阶3的操作,或者其他办法可以让屏幕直连树莓派串口。那么看下面这个操作,可以让你不拆机直接刷屏幕固件。
刷固件的教程直接写在了Git上
https://github.com/ytlzq0228/Nextion_Fw_Update
注意,因为刷固件失败率还是蛮高的,所以为了刷机方便,特别设计了用GPIO来连接串口屏的REST引脚,在程序开始的时候,会先发送一个低电平来硬件复位串口屏。防止上一次失败之后卡在刷机界面,还要手动拔插屏幕重启。 至于连接到啥GPIO,我本身用的就是SC16IS752来扩展了一路USART接口,所以自然用的就是SC16IS752上的扩展GPIO。当然,也可以使用其他的GPIO接口。
然后,屏幕就可以在盒子里通过串口来直接刷固件了。开心~~
串口屏的开发很灵活,各位友台有兴趣的可以多多发挥你的有趣创意,试试看。
这个小项目基本就这样了,可能对于开发者来说,这个项目非常简单。但是对于HAM们来说,如果理解起来费劲的话,也可以私信联系我帮忙处理。
这里是BI1FQO,DMR ID:4606666,希望各位HAM通联愉快!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。