【逗老师的无线电】MMDVM串口屏相关开发

哎呀呀,终于研究通透了MMDVM的串口屏相关了。

在这里插入图片描述在这里插入图片描述

一、Nextion和陶晶驰串口屏

MMDVM默认对接的是Nextion屏幕。但是有人跟我说,NXT的屏幕和国内陶晶驰的屏幕就是一个东西,只不过ROM不一样。
至于Nextion和陶晶驰到底背后有啥PY关系,我们就不管了。但是我就知道,虽然HMI文档不能跨品牌直接打开,但这俩设计软件几乎长一样,手工画图移植GitHub上的工程就行

NXT和TJC的设计软件资源

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与串口屏的通信原理

1、指令发送

MMDVM在运行过程中,会通过串口向串口屏幕发送对应的指令。包括文本更新指令和屏幕切换指令

1.1、文本更新指令

在这里插入图片描述
如上图所示,在编辑HMI文件的时候,我们可以看到页面的文本框的编号t0 t1 txxx,MMDVM通过串口向屏幕发送指令,即可更新文本框中的文本内容。
这些编号与MMDVM的Nextion Display模块的各个字段名称一一对应。这些字段名称的含义在两个地方可以找到:

例如,需要更新TX发送频率,MMDVM会向屏幕发送指令

t32.txt="439.600Mhz"

屏幕上t32文本框则会显示MMDVM发送过来的文本内容,如下图所示

在这里插入图片描述

1.2、页面切换

串口屏幕一般情况下会具备如下几个页面,包括主页面,DMR、YSF等各种制式的通信页面。
在这里插入图片描述
在需要切换页面的时候,MMDVM会通过串口发送下述命令。
注意,这些页面名称基本写死了,所以在自定义屏幕HMI的时候,需要创建相同名称的页面,但是无所谓页面ID,MMDVM并不会以ID进行page更新指令。

page MMDVM
page DMR

1.3、隐藏指令

在后面开发HMI工程,以及参考GitHub上的各种工程时,发现除了上面两种显性指令以外,MMDVM还具有几个隐性指令

1.3.1、S0触控热区刷新指令

每次更新完成任意指令之后,MMDVM一定会在当前页面点击一次S0触控热区,关于触控热区,属于串口屏上一个透明的触摸按钮。所以对于需要在串口屏上进行数据处理的动作,可以写在S0的触摸动作里。

1.3.2、MMDVM.status.val状态码

在page MMDVM页面,有一个status变量,此变量很有意思,存储的是MMDVM更新状态代码。MMDVM在更新不同的字段内容之后,会将代码赋予不同的值。例如64代表刚刚更新过的是DMR TS1的呼号,72代表刚刚更新过DMR TS2的呼号
page MMDVM的status状态码在https://github.com/g4klx/MMDVMHost/blob/master/Nextion.cpp里面声明的

在这里插入图片描述

关于上述两个隐藏指令的功能,后面讲到HMI工程开发的时候会具体说明。

2、触控回传

支持触摸操作的串口屏幕,在触摸动作发生之后,会按照配置通过串口发送相应指令。如下图所示
在这里插入图片描述

如果使用NextionDriver,其会侦听串口,并在侦听到指令之后执行相应的动作。
关于NextionDriver可以响应的串口指令如下:
Sending commands from the display
例如上图的2A FB 02 FF FF FF对应的动作即为显示UserDB更新时间
在这里插入图片描述

3、串口屏硬件连接方式

如果不使用NextionDriver,MMDVM直连串口屏,有两种方式:

  • 通过树莓派板载串口直接与串口屏通信
  • 通过双工或者单工热点版的NXT接口进行通信

由于安装双工热点版之后占用了树莓派上唯一的一个板载异步串口,所以在使用热点板的情况下,只能选择第二种方式进行通信。
两种通信方式的主要区别是,使用树莓派板载串口,可以使用115200波特率高刷通信(),使用modem串口,只能以9600波特率通信。
在这里插入图片描述
在这里插入图片描述
如果使用NextionDriver,MMDVM侧选择使用dev/ttyNextionDriver这个虚拟串口,NextionDriver选择实际使用的物理串口。

4、NextionDriver扩展摸扩的作用

4.1、NextionDriver介绍

可能很多朋友有误会,认为使用串口屏一定要安装NextionDriver驱动。其实不是的
如前文所说,NextionDriver的主要功能和特点是:

  • MMDVM不再直接选择物理串口,而是选择/dev/ttyNextionDriver这个虚拟串口
  • /dev/ttyNextionDriver虚拟串口接收来自MMDVM的串口指令,经过处理后发送给物理串口
  • NextionDriver可以处理和扩展来自MMDVM的串口指令,例如添加DMR Alisa,Location,CPU TEMP这些原本MMDVM没有的字段
  • NextionDriver可以侦听来自触摸屏的触控指令。

不装该项目也行,不是必选,但是有些字段不传递

4.2、NextionDriver GitHub传送门

https://github.com/on7lds/NextionDriver
https://on7lds.net/42/

4.3、安装NextionDrive

https://github.com/on7lds/NextionDriverInstaller
在这里插入图片描述

4.4、配置NextionDriver

NextionDriver的参数本身也位于 MMDVM 配置文件的额外部分 [NextionDriver]中(MMDVM.ini 或 PiStar 上的 /etc/mmdvmhost)
配置字段含义参考https://github.com/on7lds/NextionDriver/blob/master/README-options.md
在这里插入图片描述

三、参考GitHub上几个经典NXT屏幕工程

1、MMDVM项目中的NXT基础工程

关注其中的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的布局字段进行开发。

2、ON7LDS的扩展项目

https://github.com/on7lds/NextionDriver/tree/master/Nextion
这几个HMI工程很具有参考意义
在这里插入图片描述

四、串口屏幕程序设计

1、陶晶驰wiki:

后面有关于代码的问题,可以先去看官方wiki,上面啥都有
http://wiki2.tjc1688.com/start/index.html

2、创建工程

参考:陶晶驰WIKI-新建一个工程

后文的教程,可以参考逗老师最近创建的一个工程文件
示例MMDVM串口屏HMI工程文件

3、MMDVM主页

page MMDVM为待机界面,名称一定要是"MMDVM"
在这里插入图片描述

4、DMR页面和YSF页面

名称一定要是DMR和YSF
在这里插入图片描述
在这里插入图片描述

五、进阶操作

1、进阶操作1-呼号历史记录显示

以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
  }
}

2、进阶操作2-反向触控

2.1、常规操作

如果使用NextionDriver,其会侦听串口,并在侦听到指令之后执行相应的动作。
关于NextionDriver可以响应的串口指令如下:
Sending commands from the display
例如上图的2A FB 02 FF FF FF对应的动作即为显示UserDB更新时间。

2.2、Linux指令

如果发送的指令格式是

2A F1 (linux command) FF FF FF

则可以在树莓派上执行任意Linux指令,并将运行结果的第一行返回给msg.txt
例如:
在这里插入图片描述

3、进阶操作3-骚活-I2C转串口

这是一个比较有意思的操作。由于树莓派上只有一个异步串口,并且连接了热点版。所以目前绝大部分朋友的串口屏,都是从热点版上的NXT接口扩展出来的,这个NXT接口是经由热点版的STM32单片机的异步串口透传来自主机端的指令,主机端选择Nextion设备接口为modem,说是透传,但是接在热点版上的串口屏确实了两个功能:

  • 刷固件,modem接口模式不支持上位机向串口屏更新TFT文件,想刷串口屏。只能拔下来插SD卡更新
  • 不支持115200bps的高刷,只能以9600bps波特率进行通信。

既然这样,咱就开始整活呗。I2C总线上反正能挂一堆设备,有没有设备能把I2C转成USART的。我日哦,还真有。
SC16IS752芯片,用于在I2C总线上挂一个设备,并转出两路USART异步串口+8路GPIO,而且树莓派OS内核已经包含了SC16IS752的驱动,拿来就能直接用,骚不骚。
SC16IS752的产品,微雪有一款模块,大家伙可以去找找。同时淘宝直接搜,还有一款紫色的体积更小的模块,只要15块钱左右,大家自己搜搜,我就不贴链接了。

在这里插入图片描述

如上是接口定义,一看就懂。
最后的效果就是贼爽,不管多少块屏幕,一组I2C总线搞定

在这里插入图片描述
在这里插入图片描述

4、进阶操作4-串口刷屏幕固件

对于做好的TFT工程文件,常见的办法是卡刷,确实比较简单。
但是热点盒子要卡刷屏幕文件,要拆机才能刷,不够优雅。
如果你已经实现了进阶3的操作,或者其他办法可以让屏幕直连树莓派串口。那么看下面这个操作,可以让你不拆机直接刷屏幕固件。
刷固件的教程直接写在了Git上
https://github.com/ytlzq0228/Nextion_Fw_Update
注意,因为刷固件失败率还是蛮高的,所以为了刷机方便,特别设计了用GPIO来连接串口屏的REST引脚,在程序开始的时候,会先发送一个低电平来硬件复位串口屏。防止上一次失败之后卡在刷机界面,还要手动拔插屏幕重启。 至于连接到啥GPIO,我本身用的就是SC16IS752来扩展了一路USART接口,所以自然用的就是SC16IS752上的扩展GPIO。当然,也可以使用其他的GPIO接口。
在这里插入图片描述
然后,屏幕就可以在盒子里通过串口来直接刷固件了。开心~~
在这里插入图片描述

结尾

串口屏的开发很灵活,各位友台有兴趣的可以多多发挥你的有趣创意,试试看。
这个小项目基本就这样了,可能对于开发者来说,这个项目非常简单。但是对于HAM们来说,如果理解起来费劲的话,也可以私信联系我帮忙处理。
这里是BI1FQO,DMR ID:4606666,希望各位HAM通联愉快!

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逗老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值