水比赛系列-HMI串口屏的使用


感觉屏幕基本上算是展示类比赛比较常用的控件了,然 后是像电赛这样的,需要就是题目有很多步,需要我们一步步的去设置模式,传统的方式是按照按键等方式进行响应,当然使用触摸屏等也是可以的,一般现在也有很多项目会采用屏幕来做一些信息的展示之类的,但是做成一个好看的GUI未免太过麻烦了,所以不如 直接就二次开发GUI,使用别人已经做好的GUI,使用上位机进行编程呢个,就会相对而言方便很多!

所以做个比赛,如果单纯是为了拿个奖,拿到证书,建议还是可以怎么方便怎么来,怎么快怎么来,时间越多,迭代的速度就越快啊!

当然使用按键和触摸屏也可以参考我之前的博客:

1、HMI串口屏介绍

大概两年前我开始从学长那边接触到串口屏,后面就一直用串口屏了,比较推荐就是陶晶驰的串口屏,开发起来比较方便!

1、选型介绍

官方宣传图给串口屏做的页面还是不错的,毕竟东西效果好才方便卖出去对吧,串口屏页面如下所示:
在这里插入图片描述
然后目前陶晶驰的串口屏有几个系列,我们打开官方上位机然后新建设备就能看到:
在这里插入图片描述
这里注意就是T0的好像快停产了,尽量不要用了吧,不过也是最便宜的,记得当时买的时候大概也就30来块钱一块的样子,最近受疫情影响好像是涨价了一点的。

另外就是这个触摸屏有电容和电阻屏两种,电容屏的价格比电阻屏是要稍贵一点的,但是同样的就是电容屏触摸的时候是可以就是多点触摸,但是电阻屏需要单点触摸,就是像我们操作以前那些旧机器的时候要用指甲去按下才行的,比较容易的区分就是电阻屏的屏幕引出的线这里有较明显的四根线,如下所示:
在这里插入图片描述

2、开发工具

使用串口屏有几个网站还是必不可少的,可以帮助我们查资料用别人的模版

首先是官方的一个资料网站,官方固件的升级更新都会在这里:USART HMI资料中心
在这里插入图片描述
我们可以在上面获取我们开发串口屏需要的上位机,上位机就是一个官方写的上位机工具,还是很方便的:
在这里插入图片描述关于这里屏幕型号的选择,一方面是可以就是通过我们直接查看我们购买的淘宝介绍,另一方面也可以直接就是看屏幕背面的白色丝印,只要能对应的上就行了,下图展示了丝印所在的位置:
在这里插入图片描述

3、新建工程

这里我们新建工程的话不会像官方展示的工程那样炫酷的哈,如果什么都不做就的确会是一片空白,就什么都没有的那种:
在这里插入图片描述
所以这里我就比较推荐这个了:在线PS,因为我们要做的也不是特别大的海报什么的比较牛皮的工程,只是给自己页面做个背景罢了,所以随意一点就行了,不用管太多了,直接上吧,这里我直接用的官方给的模版,因此第一步就是修改图像大小
在这里插入图片描述
取消图像的这个横纵比的链接关系,输入我们想要设置的值,当然这里就是指我们屏幕的分辨率了
在这里插入图片描述
接下来就可以导入图片到我们屏幕里面了!

2、HMI串口屏常用控件

开发串口屏其实最多的就是开发他的屏幕控件了,这里采用的是比较常见的GUI布局的方式来进行的开发,常见的GUI如下所示:(这里注意就是不是所有的控件都可以用的,我这里用的是X3版本的,基本上除了视频用不了都是可以用的但是T0系列不能用的控件就比较多了,但是最基本的一些控件还是有的),最让我吐槽的还是T0系列背面明明放了一个SD卡的插槽却无法使用文件流的插件,等于这个SD卡只能用来升级固件
在这里插入图片描述
这里控件我就不详细的一个个介绍了,因为官方教程里面都写过了,官方对每一个控件都写过比较详细的说明,这里我只是挑几个觉得比较常见的功能做个介绍!
在这里插入图片描述

1、字库图片

其实对于串口屏开发而言,第一步应该是准备素材还有字库,当然这两部其实都不怎么耗费时间罢了,他们都在左上方的工具里面可以找到
在这里插入图片描述
下面就可以开始制作字库了这里如果不是常用的字库就完全可以用这个范围,因为可以节约内存嘛
在这里插入图片描述
选用指定字符的时候就可以输入我们需要的字符了,为啥要这样呢,因为这个屏幕其实本身也是单片机来控制的,单片机的FLASH一直都是稀缺资源,所以肯定就是能省一点就是一点嘛,尽量不要浪费资源
在这里插入图片描述

2、页面切换

这里我们在右上角可以看到页面新增的指令,点击加号就可以切换页面
在这里插入图片描述
页面也换的逻辑也是只需要我们就是稍微编写下逻辑性的代码即可,比如下面按钮的弹起事件设置为page page1就是页面切换到page1了
在这里插入图片描述

3、字符最大长度

这里我们经常要给变量设置一些初始值或者是一些预设的值,这里要注意的的就是这里的这个字符最大长度,这里字符最大长度决定了能写多大的变量,这里还是很常规的就是中文两个字节,然后字母数字都是一个字节,字符串长度不够会设置失败
在这里插入图片描述

4、全局还是私有

全局还是私有变量决定了以下两种情况:

  • 1、刷新页面这个变量会不会清零
  • 2.是不是能在其他页面改变这个变量
    在这里插入图片描述

5、亮度调节和波特率

这个基本上是比较常见的功能了,因为一个是常见外观,然后一个是通信上很常见的设置,这里我们可以在上电的时候设置好,当然就是也可以在后面对他们进行修改
在这里插入图片描述
下面是我使用滑块来对他进行修改的示例
在这里插入图片描述

6、变量

这里官方还提供了一个变量的控件,这个控件的话就我个人理解主要是做一些标志位的处理,然后一些数据的暂存这样的功能类似的
在这里插入图片描述

7、定时器

通过设置定时器可以设置一些定时事件,比如更新页面这样的,定时器有个比较常见的就是开启和关闭,可以通过按钮来打开或者关闭定时器,这样可以玩的花样就多了
在这里插入图片描述

8、初始化事件

在屏幕的右边一侧可以看到这个初始化,这个部分的代码只会执行一次,里面有一些注释,主要是一些全局变量然后还有上电刷新的页面,当然就是波特率还有背光亮度也可以在这里设置
在这里插入图片描述

3、串口屏数据交互

1、串口发送数据

屏幕提供了两种方式进行串口的数据收发,分别是printh这个一般是用来发送hex的。
在这里插入图片描述
然后就是prints,这个就可以发送变量或者常量了,当然就是这个后面还要说明长度大小,具体的打出来都会有官方提示的
在这里插入图片描述

2、模拟器仿真

这里我们可以就是点击调试进入模拟器仿真
在这里插入图片描述
模拟器页面如下,可以发送指令和查看我们模拟器返回的数据,这个应该是比较真实的
在这里插入图片描述
提现比较真实的就在这里了,他这里还提供了这个虚拟SD卡文件,就是说比如我们要操作这个虚拟SD卡的时候,按理说没有真的SD卡就很难操作对吧,但是他这里的虚拟SD文件就可以查看我们SD卡到底写入了什么,基本和实际情况是一致的!
在这里插入图片描述
卡伊打开这个虚拟SD卡文件看到我们写入的信息如下
在这里插入图片描述

3、发送指令改变控件的值

这里发送指令和我们在上位机里面的操作是一样的,比如我们要修改n0控件的值,发送n0.val=100就可以了
在这里插入图片描述
但是使用单片机来发送的话我们要加上一个介绍标志,没发送结束标志就认为没有修改,结束指令就是0xff,0xff,0xff,这样连续发送三个就可以了
在这里插入图片描述
这里官方还给了这个发送函数,可以看到也是这样的一个逻辑
在这里插入图片描述
下面是改变字符串的内容的在这里插入图片描述
当然这个并不复杂我们也可以就是用字符串拼接的方法来实现我们的目的!
在这里插入图片描述

4、源码

hmi.c

/********************************
hmi部分
********************************/

//10的乘方函数,用于判断位数
uint32_t HMI_Pow(uint8_t n)
{
    
    
  uint32_t result = 1;
  while(n--)result *= 10;
  return result;
}
//数值发送函数
//USART_TypeDef* USARTx: 选择串口输出,注意必须先初始化、使能串口
//u16 *data:上位机上数字位相应的改变数值代码
//u8 len:*data代码的长度。
//u16 Num:需要显示的数值,注意开头0不显示
//u8 len2:需要显示的数值的位数
void HMI_SendNum(UART_HandleTypeDef *USARTx, uint8_t *data, uint8_t len, uint16_t Num, uint8_t len2)
{
    
    
  uint8_t t;
  for(t = 0; t < len; t++)
  {
    
    
    while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
		USARTx->Instance->DR = (data[t] & (uint16_t)0x01FF);
  }
  for(t = 0; t < len2; t++)
  {
    
    
    while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
		USARTx->Instance->DR = (('0' + (Num / HMI_Pow(len2 - t - 1)) % 10) & (uint16_t)0x01FF);
  }
  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
	USARTx->Instance->DR = (0XFF & (uint16_t)0x01FF);

  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
  USARTx->Instance->DR = (0XFF & (uint16_t)0x01FF);

  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
  USARTx->Instance->DR = (0XFF & (uint16_t)0x01FF);
}
//字符串发送函数:HMI_SendText(USART_TypeDef* USARTx,u8 *data,u8 len,u8 *text,u8 len2)
//            USART_TypeDef* USARTx: 选择串口输出,注意必须先初始化、使能该串口
//            u16 *data:上位机上文本位相应的改变数值代码,如"t0.txt="、"t1.txt="
//          	u8 len:*data代码的长度。如"t0.txt="长度为7。
//            u8 *text:需要串口输出显示的文本
//            u8 len2:需要显示的文本的长度,英文一个字符一字节、汉字一个字两个字节

void HMI_SendText(UART_HandleTypeDef *USARTx, uint8_t *data, uint8_t len, uint8_t *text, uint8_t len2)
{
    
    
  uint8_t t;
  for(t = 0; t < len; t++)
  {
    
    
    while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
    USARTx->Instance->DR = (data[t] & (uint16_t)0x01FF);
  }
  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
  USARTx->Instance->DR = (0X22 & (uint16_t)0x01FF);
  for(t = 0; t < len2; t++)
  {
    
    
    while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
    USARTx->Instance->DR = (text[t] & (uint16_t)0x01FF);
  }
  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
  USARTx->Instance->DR = (0X22 & (uint16_t)0x01FF);

  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
  USARTx->Instance->DR = (0XFF & (uint16_t)0x01FF);

  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
  USARTx->Instance->DR = (0XFF & (uint16_t)0x01FF);

  while(__HAL_UART_GET_FLAG(USARTx, UART_FLAG_TC) != SET);
  USARTx->Instance->DR = (0XFF & (uint16_t)0x01FF);
}

猜你喜欢

转载自blog.csdn.net/m0_51220742/article/details/123955312