【逗老师的无线电】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
在这里插入图片描述
如果不想SSH上去改配置,可以在MMDVM的Expert配置页中,找到Nextion配置字段,修改port的值为/dev/ttyNextionDriver
在这里插入图片描述
然后再往下翻,找到NextioDriver的配置,确认port配置为串口屏的物理串口,或者为modem
在这里插入图片描述

三、参考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通联愉快!

<think>嗯,用户想了解如何将K210连接到陶晶驰的串口,我得先回忆一下相关硬件连接和配置步骤。首先,K210开发板通常有几个UART接口,而陶晶驰串口一般使用UART通信,所以需要确定两者的引脚对应关系。根据参考内容,陶晶驰的引脚是5V、GND、TXD、RXD,所以K210那边需要对应的电源、地线和UART的TX、RX交叉连接。也就是说,K210的TX应该连接到串口的RX,RX连接到串口的TX。 接下来是软件配置部分。K210使用MicroPython的话,可能需要初始化UART模块,设置正确的波特率。陶晶驰的波特率可能有多种,比如9600或115200,用户需要根据幕的具体型号来设置。然后,发送指令的话,串口通常有特定的协议,比如通过发送特定的字符串或十六进制指令来控制显示内容。例如,显示文本可能需要发送类似于“txt 1.txt=“hello””这样的指令,但具体格式得参考陶晶驰的文档。 另外,用户提到代码简单,能够回传字符串,可能涉及到双向通信。比如,幕上的触控事件可能会通过串口发送数据给K210,所以需要设置接收中断或者轮询读取数据。这部分在代码中可能需要注册回调函数或者不断检查缓冲区。 还有可能需要注意电平匹配的问题,K210的UART是否是3.3V电平,而串口如果是5V的话,是否需要电平转换?不过参考中提到的引脚有5V,可能直接连接电源,而信号线可能兼容,但需要确认,避免损坏设备。 最后,用户可能需要具体的示例代码,包括初始化UART、发送指令和接收数据的部分。应该分步骤说明硬件连接和软件配置,并提醒用户检查波特率、指令格式是否正确,以及如何调试可能出现的问题,比如无显示或通信失败的情况。</think>### K210连接陶晶驰串口方法 #### 1. **硬件连接** 陶晶驰串口的通信基于UART协议,需连接以下引脚: - **K210**端:选择任意UART引脚(如`UART1`或`UART2`),常用引脚为`IO6(TX)`和`IO7(RX)` - **接线方式**: $$ \text{串口} \begin{cases} \text{5V} \to \text{K210的5V电源} \\ \text{GND} \to \text{K210的GND} \\ \text{TXD} \to \text{K210的RX引脚(如IO7)} \\ \text{RXD} \to \text{K210的TX引脚(如IO6)} \end{cases} $$ 注意:需确保串口与K210的波特率一致(如9600、115200等),具体值需参考幕手册[^1]。 --- #### 2. **软件配置** 以MicroPython为例,配置UART通信: ```python from machine import UART # 初始化UART1,波特率115200(需与幕设置一致) uart = UART(UART.UART1, 115200, bits=8, parity=None, stop=1) # 发送指令示例:显示文字 def show_text(text): cmd = f'txt 1.txt="{text}"\r\n' # 假设幕控件ID为1 uart.write(cmd.encode()) # 接收幕返回数据(如触控事件) if uart.any(): data = uart.read() print("Received:", data) ``` --- #### 3. **指令格式** 陶晶驰串口支持文本、图片、控件操作等指令,例如: - **文本显示**:`txt 1.txt="Hello"`(控件ID为1) - **触控事件返回**:格式通常为`pageID-widgetID`(如`P1-B1`表示页面1的按钮1被按下) --- #### 4. **调试建议** - **无显示**:检查接线(TXD/RXD是否交叉)、波特率、电源是否正常。 - **指令无效**:参考幕手册确认指令格式,或通过`UART.write()`发送测试指令(如`vis 1,0`隐藏控件)。 - **触控无响应**:确保幕固件支持触控回传,并启用对应功能。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逗老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值