基于串口通信的电子相册设计
![基于串口通信的电子相册设计](https://static001.geekbang.org/infoq/1c/1c27bdb426ad54277a0681fdf7c0c9c5.jpeg)
采用一块 COF 智能屏测试,经过一番摸索,详细了解了串口通讯的具体用法,结合上位机,试用 Python 脚本来进行通讯,实现了一个简单的电子相册的功能,下面将我的经验进行分享。
这篇分享,涉及或需要了解下面的知识:
1. 迪文 COF 智能屏基础了解
2. 运行时内存中数据存储的原理
3. 迪文 DBUS GUI 开发软件
4. 串口指令的基本使用
5. 串口传送图片数据的原理
6. 电子相册的原理
7.Python 基本知识
有 Python 编程经验最好,没有的话,Python 代码,也应该基本可以看懂的。
主要涉及到两个部分:
1. 图片处理
2. 串口发送图片数据
一、基本了解
首先,我们了解一下迪文 COF 智能屏:简单来说,这个 COF 智能屏,能够一芯两用--一颗芯片两个核心。一个核心,是用来处理 GUI 界面的,也就是 DBUG GUI 开发软件所设计的组态界面。一个核心,是 8051 核心,可以自己用 C 或者用汇编来编写运行程序,一方面,可以与处理 GUI 的核进行交互,另一方面,可以与外设进行交互。两个核能够独立运行,相互不干扰,确保了 GUI 处理能够高效的进行。
![](https://static001.geekbang.org/infoq/3c/3c599f82ac4d26d338d8cdc72bc4ba02.png)
在基本的使用中,我们不用自己编写运行程序,因为官方提供了一个基础的运行程序,来进行串口指令的解析,并实现对 GUI 核的交互。这个基础的串口指令的交互,通过 UART2 来进行,通过转接板上的 USB 接口与电脑连接并安装好驱动后,我们就可以通过电脑的串口,与屏的 UART2 进行通信了,其对应的协议,就是指南上所说的 UART2 串口协议。
![](https://static001.geekbang.org/infoq/4c/4c89e8e8398f9971d718d71ae1afed5c.png)
二、运行时内存数据存储的原理
然后,我们再来了解一下 COF 智能屏运行时内存中数据存储的原理。后面我们使用 DBUG GUI 开发软件进行界面设计的时候,大部分的控件,都会有一个描述地址和一个变量地址。当设计的界面,下载到 COF 智能屏后,是通过描述地址和变量地址中的数据,来决定具体的呈现和交互的。所谓的描述地址,实际上,就是这个控件的各项属性,在内存中存放的地址。而变量地址,则是其对应的数据,在内存中的存放地址。不同的控件,其描述地址对应的内存中,存放的数据,是不同的,需要查看开发指南具体了解。系统可供使用的地址空间,为 0x0000-0xFFFF,其中 0x0000-0x0FFF 为系统变量接口地址,被系统占用了,而 0x1000-0xFFFF,则可以被我们自定义使用。
![](https://static001.geekbang.org/infoq/e6/e68984869cae4e4a78f9b67acd2e6b88.png)
举个例子:
1 个文本显示控件,我们需要设定它的数据放在那里,需要设置它在屏上显示处理的坐标地址,还要它的用什么颜色,这些信息,就存放在描述地址对应的内存中。
![](https://static001.geekbang.org/infoq/ee/eef319a57d15f8c1402fb9a8420bd402.png)
再比如,我们可以设置一个变量图标显示,要给这个变量设置值为 8,这个 8,就会存放在变量地址对应的内存中。而如果我们要改变这个变量显示控件实际显示处理的数值,那我们只要改变它对应的数据变量地址里面的值即可。如果我们把一个增量控件的变量地址也设置为上面这个变量显示空间的变量地址,那么实际运行时,触摸点击这个增量控件,就能带来变量显示控件的关联变化。而在实际的运行使用过程中,我们就是通过各种方法,来对这些内存中的数据进行控制,从而达到预期的逻辑和目的。
三、DBUS GUI 开发软件
了解了控件的描述地址和变量地址,我们用 DBUG GUI 开发软件来具体进行设计,为后续的串口通信做准备。DBUG GUI 的易用性非常高,基础使用,这里就不多说了,大家去看看指南,看看视频,很快就学会了。通过迪文的开发指南,我了解到,要实时显示图片,需要用到图标叠加显示控件,因此,我们就先在界面上,添加一个图标叠加显示控件。这个图标叠加显示控件,也有一个描述地址和一个变量地址。我们把描述地址设置为 1010,变量地址设置为 7FFE。
![](https://static001.geekbang.org/infoq/75/75ae68fef66b6491827b90991ab251a5.png)
然后,我们可以通过 显示 -- 查看,来了解当前的描述地址和变量地址的使用情况,避免冲突。
![](https://static001.geekbang.org/infoq/cb/cb5bd63087bcf7303fb004c0a4aeaede.png)
在上图中,我们可以看到,描述地址又叫 SP,变量地址又叫 VP。那么,后续的使用中,我们将会通过控制 SP 和 VP 对应的数据,来达到我们需要的效果。设计好以后,把生成的文件,通过 SD 卡或者串口下载到设备上面即可。
四、串口指令的基本使用
前面说了,COF 智能屏运行时,我们实际上,是在与内存中的数据打交道,从而实现预期的逻辑和目的。通过控件之间变量地址的关联,可以实现对数据的控制;通过编写 C51 核的运行程序,也可以实现对数据的控制。而通过前面所说的 UART2 协议,我们就能通过串口给 COF 智能屏发送指令,通过指令,来间接的控制内存中的数据,控制了这些数据,就等于能够控制具体的运行逻辑了。对于 COF 智能屏来说,基本的数据指令如下:
![](https://static001.geekbang.org/infoq/9c/9cab3d3858b1a0b6b998b7b45462937f.png)
在上图中,包含了读和写的指令,方便我们查看内存中的具体数据情况,并设置需要的数值。如果进一步了解,我们还会从指南中了解到,UART2 也能够操作系统变量。上面的指令,我们可以使用串口工具发送,也可以通过 DBUS GUI 设计软件中自带的 SPI 指令工具下发。
![](https://static001.geekbang.org/infoq/5d/5d198880e27e196b57ddf29b39cc08f4.png)
需要注意的是,其中一个字节,表示 4 位 16 进制 HEX 数据。例如:我们可以发送下面的指令,让屏重启:
![](https://static001.geekbang.org/infoq/aa/aa8e91d37681e5ab61434335bf4f2522.png)
我们可以发送下面的指令,获取屏的版本信息:
![](https://static001.geekbang.org/infoq/3e/3ede3a1780147bdb2da321f0361f3829.png)
其中,45 表示 GUI 软件版本,10 表示 DWIN OS 版本。在前面设计界面时,我们添加了一个图标叠加显示控件,其的描述地址为 1010,变量地址为 7FFE,现在,我们通过串口读取他们的数据:
![](https://static001.geekbang.org/infoq/58/581f6b661f13045e1450535c39f94d45.png)
在上面的 5a a5 04 83 10 10 10 对应的返回结果中,表示描述地址中存放的信息,我们可以看到一些关键信息:
7f fe:指明了变量地址位于哪里
00 50:表示 x 坐标位置
00 9b:表示 y 坐标信息
00 82:表示宽度
00 55:表示高度
在上面的 5a a5 04 83 7f fe 10 对应的返回结果中,我们看到的都是 0,因为还没有图片数据。了解了以上信息,我们就可以在下一步中,通过串口指令,来进行操作了。
五. 串口传送图片数据的原理
通过手册,我详细了解了图标叠加显示控件实时更新图片的具体原理。简单来说,就是其变量地址中,存放了对应的图片数据信息,而通过改变这个图片数据信息,我们就能控制图标叠加显示控件具体显示的内容。我们只需要通过串口,把一张图片的十六进制数据,通过 UART2 的写指令,存放到对应的变量地址即可。而因为系统的限制,可使用的存放空间为 8000-FFFF,一个 64K,也就是说,图片数据,不能超过这个值,否则会溢出。其具体的说明,可以查看指南:
![](https://static001.geekbang.org/infoq/0f/0ff11e4cc45a2fb600b7312e2116d251.png)
图片的具体数据,我们可以通过打开一张图片,查看其 HEX 格式的数据:
![](https://static001.geekbang.org/infoq/49/49e92a7bc2f997cda8e989caea5a73b8.png)
把这些指令,依次通过串口发送到 COF 智能屏即可。但在实际使用中,根据具体的情况,每次发送 240 字节的数据,依次发送到对应的地址即可。如果不足 240 字节的,我们直接补 0x00 刀 240 字节。前面我说过了,UART2 串口传递数据时,一个字节,为 4 位 16 禁止 HEX 数据,所以每次发送 240 字节的数据后,对应的地址就需要增加 120,也就是 0x78。在前面,我设定了图标叠加显示控件的变量地址为 7FFE,其实际图片存放的地址,则是从 8000 开始的,所以我们把数据发送给 8000 开始的地址。
![](https://static001.geekbang.org/infoq/b4/b4d9ffe9acb92780236aeb87fbc32d8b.png)
发送完成后,执行显示指令即可。
如果我们有多张图片,需要显示,那么可以在第一张图片数据发送完成后,延时一段时间,再发送第二张图片的数据即可。
六. 电子相册的原理
要实现电子相册,我们就需要过一段时间,给 COF 智能屏,发送下一张图片数据信息。然而,在实际使用中,因为显示图片时,有一个刷新的过程,发送一张新的图片数据后,执行显示指令时,会导致花屏一会马上正常,或者晃动一下,这样子的使用感受不是很好。通过了解后,使用了一个变通的方法。在界面上,使用两个图标叠加显示控件。如果要显示图片了,那么就把其中一个先给隐藏,然后发送数据,然后再执行渲染,完成了以后,再把它给显示出来即可。同样的,如果要发送新的图片数据了,那么就把另外一个如法炮制,等新的显示出来的时候,再把旧的给隐藏了。如此一来,我们通过交替的发送数据,交替的进行隐藏,从而确保了图片在显示交替的时候,不会出现花屏或者晃动的情况。
![](https://static001.geekbang.org/infoq/81/812a6bf4a62daf6dee9064795e889cf9.png)
通过以上的逻辑,已经有同学,实现了效果非常不错的视频数据的显示。但这样又会给我们带来了新的限制,因为最大只有 64K 空间做为图片数据存放,那我们的图片,就只能最大有 32K 大小了。好在,在这个屏上面,32K 的图片,显示出来,效果也非常不错。图片的交替显示问题解决了,为了更好的显示效果,又做了进一步的考虑。
![](https://static001.geekbang.org/infoq/a5/a52eea59be90548909e324b93f26e9ed.png)
在第四个部分,我们可以通过访问控件对应的描述地址对应的数据,获取了控件的位置信息和尺寸信息,同样的,我们也可以给这些数据对应的地址,发送信息,来修改它的位置和尺寸。在我交替显示图标叠加显示控件中,隐藏操作,实际上,就是把其对应的坐标,修改到屏幕外即可,要不隐藏了,再把它对应的坐标,修改到屏幕内即可。而我的实际演示中,会有图片从右到左滑动显示出来,也是通过修改其地址,来实现的。为了方便实现效果,在电脑上,我使用 python,来进行图片数据的解析,以及通过串口 UART2 协议,给 COF 智能屏发送数据,以及控制具体的显示逻辑,其具体的处理流程如下:
![](https://static001.geekbang.org/infoq/63/637e7937e102815f767d4ed3359803de.png)
在上面的处理流程图中,没有详细的标注判断和循环等,怎么简介怎么来,主要为了说明逻辑。其中具体使用到的指令包括:
隐藏控件:5a a5 07 82 描述地址高位 描述地址低位+1 屏幕宽度高位 屏幕宽度低位 00 00
移动控件:5a a5 07 82 描述地址高位 描述地址低位+1 屏幕宽度内地址高位 屏幕宽度内地址低位 00 00
修改尺寸:5a a5 07 82 描述地址高位 描述地址低位+3 尺寸宽度高位 尺寸宽度低位 尺寸高度高位 尺寸高度低位
发送图片数据:5A A5 F3 82 变量地址高位 变量地址低位+2 图片 HEX 数据
渲染图片:5A A5 07 82 变量地址高位 变量地址低位 5A A5 变量地址高位 变量地址低位+2+2 具体的代码如下:(完整代码见附件)
![](https://static001.geekbang.org/infoq/09/094868628962f6fc757e42d71d6d1d23.png)
![](https://static001.geekbang.org/infoq/e1/e1fa8e9126ee5e8710b67dbc411e4df9.png)
![](https://static001.geekbang.org/infoq/ec/ec4025eabfb8412bc81e5f30ee6294ad.png)
实际呈现的效果如下:
![](https://static001.geekbang.org/infoq/1b/1be4692b7a9812865320f0cc5b1d7c73.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
![](https://static001.geekbang.org/infoq/93/93a1730a9cb8c07211f74078f0a3a00e.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
![](https://static001.geekbang.org/infoq/c0/c089b6a4ab70afdef259fa1ff4ceaeab.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
版权声明: 本文为 InfoQ 作者【芯动大师】的原创文章。
原文链接:【http://xie.infoq.cn/article/ebacdbaea87abb0d1e16b4dd7】。文章转载请联系作者。
评论