迪文屏DMT12800K070_A2WTC踩坑实录(二)

本文档详细介绍了嵌入式系统中迪文屏DMT12800K070_A2WTC的串口通信实现,包括与Hi3531D的指令交互、亮度调节子页面设计以及内窥镜页面的按键返回功能。开发者通过串口通信解决两板间指令传递,并实现亮度调节、内窥镜页面的按键控制和数据录入功能。此外,还提及了使用PS升级素材和处理串口数据包的方法。
摘要由CSDN通过智能技术生成

因整体记录篇幅较长,故进行了切割,此文为前文 迪文屏DMT12800K070_A2WTC踩坑实录(一)的接续部分。

一、渐入阶段

  之前设计的主页面中分设了 “内窥镜”、“设置” 以及 “日志” 三个大模块,目前分别对应主页面 001.bmp 后的背景图片。因为人机界面设计实际上是个协同性质的任务,有些设计不是自己想做就能马上实装的,所以接下来的设计实现过程看起来或许会比较混乱。
在这里插入图片描述

1. 串口通信:接收来自Hi3531D的指令

  完成主页面的初步设计后,先解决一下两块板子的通信问题。不然每次更新完迪文屏的工程都要用串口助手发送一次初始化完成的页面跳转指令,有点麻烦。
  Hi3531D 端的串口硬件配置可以参考博客:Hi3531D 串口配置流程,亲测可行。串口通信程序也不难写,总体流程还是:打开串口、配置参数、读写串口、关闭串口。这里就不贴出全部的代码了,仅贴出测试相关的部分。在前一篇博客中利用串口助手发送过页面跳转指令,将其映射到程序中就是:

void sender(int fd)
{
	int len, ret;

	// 迪文屏固定帧头,包的其余内容在各自的特定函数中补全
	port_sbuff[0] = 0x5A;
	port_sbuff[1] = 0xA5;

	len = (int)port_sbuff[2] + 3;
    ret = write(fd, &port_sbuff, len);
}

// 页面指令转换:5A A5 07 82 0084 5A01 screen_id
void SetScreen(int fd, int screen_id)
{
	port_sbuff[2] = 0x07;
	port_sbuff[3] = 0x82;
	port_sbuff[4] = 0x00;
	port_sbuff[5] = 0x84;	// 系统变量 PIC_Set 地址
	port_sbuff[6] = 0x5A;
	port_sbuff[7] = 0x01;
	port_sbuff[8] = 0x00;
	port_sbuff[9] = (unsigned char)screen_id;

	sender(fd);
}

void HMI_Init(int fd)
{
	SetScreen(fd,0x01);	// 初始化完成,跳转到主页面
}

  写完串口通信程序,接好线以后在板载 linux 上运行测试,在上位机查看结果:
在这里插入图片描述
  串口助手正确地接收到了板载 linux 发出的指令,由此也可确定迪文屏必然也能接收到该指令。

PS:或者简单一些,直接在命令行下测试串口。以 uart1 为例,其在 /dev 下对应的设备文件名为 ttyAMA1:
(1)先设置波特率
stty -F /dev/ttyAMA1 115200
(2)发送数据测试
echo Test > /dev/ttyAMA1
(3)接收数据测试
cat /dev/ttyAMA1

2. 亮度调节子页面

  这是设置页面的子页面(可以根据背景色来判断)。先用 Win10 自带的画图软件简单加工一下 005.bmp(不会 PS 是硬伤 QAQ),然后添加到 DGUS 工程中:
在这里插入图片描述
  然后依次添加拖动调节、拖动刻度显示、数据变量显示控件,并配置参数(数据自动上传暂时先不管):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 因为调整的是迪文屏整体的显示亮度,所以实际调节的是背光 LED 亮度,手册中给出了其作为系统变量的地址 0x0082,三者的变量地址均需保持一致;
    在这里插入图片描述
  • 根据上一则说明,0x0082 的高字节数据具有调节亮度的功能,因此拖动调节控件的数据返回格式、滑动刻度显示的变量类型、数据变量显示的变量类型均为VP高字节相关;
  • 拖动调节的起始/终止位置对应的返回值代表调节数据的最小和最大值,都为 0 则无法拖动,且因为这里要调节的是背光 LED 亮度,最小值不宜设置为 0 ,因此设置为 10;
  • 滑动变量的起始/终止变量刻度值与拖动调节类似,都为 0 则无法拖动;
  • 因为最大值设置为 100,所以数据变量显示控件下的整数位数应设置为 3。

PS:如果上电测试后发现调低亮度一段时间后屏幕自动变亮或者变暗,就说明开启了触摸屏背光待机设置。可以选择关闭背光待机,也可以修改待机亮度。具体配置可以参考应用开发手册来修改 CFG 文件:
在这里插入图片描述

3. 内窥镜页面

3.1 使用按键返回控件

  这里第一个需要实现的就是按键控制 Hi3531D 进行录屏操作(当然录的不是迪文屏而是外部输入视频),因此需要添加按键返回型触控控件而不再是基础触控。不过按键返回型触控控件实际上也没有多复杂:
在这里插入图片描述

  • 数据自动上传勾上就行,表示开启数据录入完成时自动上传数据;
  • 键值里可以设置返回的键值数据,变量地址也是 0x1000 ~ 0xFFFF 里选一个,且同一个地址可以对应多个键值;
  • 一般来说用按字长度写,写到整个变量地址里去就可以了;
  • 虽然按键返回控件只占用一个空间地址,但保险起见还是设定成二个以上为好。

  根据上图的配置,最终在迪文屏上点击该按键返回型触控控件时,迪文屏将从串口返回数据包:5A A5 06 83 10 94 01 00 01,其中 1094 就是设定的变量地址,01 表示返回数据的字长度,00 01 就是返回的键值。

3.2 串口通信:Hi3531D接收返回值数据包

  接着则是要在 Hi3531D 端准备好迪文屏的串口包解包函数。只要对串口接收函数稍加修改即可,流程可以简单概括为:开子线程阻塞接收单个字节的数据,收到了就立即将其压入指令缓冲区队列中;在主线程中不断尝试从指令缓冲队列中提取出一条完整的指令,然后根据指令具体内容做出相应的动作。同样贴出测试相关的代码:

void *reciever(void *par)
{
	while(1)
	{
		__uint8_t data;
		int ret;

		ret = read(fd, &data, 1);
		if(ret != 0)
			queue_push(data);			// 将接收到的数据压入队列缓冲区中
	}
}

int main(int argc, char *argv[])
{
    HI_S32 s32Ret;

	...

	// 创建串口接收子线程
	s32Ret = pthread_create(&reciever_thread, NULL, reciever, NULL);
	if(s32Ret == HI_FAILURE) { printf("Read COM thread Create Failed!\n"); return HI_FAILURE; }

	while(1)
	{
		qsize  size = 0;
		__uint16_t address = 0;

		size = queue_find_cmd(port_rbuff, CMD_MAX_SIZE);	// 从缓冲区中获取一条指令
		if(size > 0)
		{
			...
			s32Ret = VENC_START();
			...
		}
	}

	...

    return s32Ret;
}

3.3 变量数据录入

  对内窥镜页面的背景图片稍加修改,同时增加键盘图片:
在这里插入图片描述
  之后在背景图片上挖好的白框位置放上变量数据录入的触控控件、数据变量显示控件以及左侧的一般文本显示控件即可:
在这里插入图片描述
在这里插入图片描述

  • 数据自动上传想必无需多言,勾上就完事了;
  • 变量数据录入控件的空间占用数量由变量类型决定,有 2 字节、4 字节和 8 字节三种,分别对应 1、2、4 个地址位;
  • 设置其他东西之前,先设置键盘:选择键盘所在的页面(上图中是其他页面),框选页面下键盘的范围,以及设置键盘显示在当前页面下的位置(点一下就可以了,定位用的是左上角);
    在这里插入图片描述
  • 之后可以在键盘以外的显示位置设置进行数据录入时,录入数据的具体情况的显示地点(也是点一下)
    在这里插入图片描述
  • 不要忘记给显示的键盘上的所有按键设置好基础触控;
  • 输入显示方式可以设置在进行数据录入时,录入的数据是直接显示还是用 * 号代替(密码模式);
  • 数据变量显示的地址和数据变量录入的地址要相同,类似于亮度调节页面中的拖动调节。

  之后要在 Hi3531D 这边的解包处理中写好对应的地址 —— 键值处理方法,博主这里对应的处理函数还有待开发,临时用 printf 代替了一下(实板调试已经通过了,这里贴预览只是为了方便截图演示):
在这里插入图片描述

二、PS(2018)素材升级(后记)

  用练手的 UI 练习好基本功能的实现后,学习一下 PS(没错咱就是现学现用的 ,之前 gui 能想到得用这玩意儿,第一次使用,轻喷 QAQ),和另一边的负责人沟通好要预留的参数调节接口,就可以升级 UI 了:
在这里插入图片描述
在这里插入图片描述
  和之前的相比,主要增加了弹出菜单的部分以及增量调节的部分。这俩实装起来都不算难,照着手册里的说明使用就可以(按理来说渐入阶段也走完就可以依赖手册继续深入学习和自主开发了。好吧摊牌了,就是懒):
在这里插入图片描述
  其余无甚,都是嵌入式 linux 应用开发的内容了,与 HMI 设计关系不大,因此这里只补录遇到的一个坑:在调试参数设置页面中的各项参数时发现迪文屏出现了不稳定的误触情况:明明按的是这个位置,迪文屏给出的响应却是按下另一个位置的响应。博主花了一个晚上查验多方无果,最后从客服处得知可能是静电问题(wdnmd),用手摸着迪文屏边上的铁框发现果然没有误触了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值