目录
·HMI串口屏介绍
·HMI串口屏开发实操
·准备
·界面认识
·写命令
·下载
·HMI串口屏与单片机(stm32)双向通信
【 功能实现:
- STM32控制串口屏对应的数值、文本完成相应变化
- 串口屏控制STM32的LED翻转
- 串口屏通过按键输入数值并发送给单片机,单片机接受并实时显示在串口屏上 】
先上效果视频
USART HMI智能串口屏整体功能展现
- HMI串口屏介绍
什么是HMI?
HMI 是Human Machine Interface 的缩写,“人机接口”,也叫人机界面。人机界面是系统和用户之间进行交互和信息交换的媒介, 它实现信息的内部形式与人类可以接受形式之间的转换。
什么是串口HMI?
串口HMI 就是设备封装好HMI 的底层功能以后,通过串口(USART 232)与用户MCU 进行交互,比如MCU 可以随时通过USART 发指令通知设备切换某个页面或者改变某个组件的属性。设备也可以随时通过USART 通知用户MCU 操作者目前触摸了页面上的某个组件或者设备当前进入了某个页面。
简而言之
USART HMI智能串口屏就是带串口控制的液晶屏(TFT-LCD)
那 为什么要用HMI串口屏?TFT-LCD触摸屏不够吗?
傻宝
触摸屏是这样的 这样的
而串口屏
是这样的 这样的
触摸屏的按键或许你得构思如何构建,页面返回你也许还需要清屏重新显示内容。而HMI串口屏只需要将自己设计的图片导入,在此基础上添加一下页面的切换口令(page)等等。因为单纯对屏幕进行而无需通信的操作完全不需要单片机。
简而言之&&个人认为
USART HMI智能串口屏
最直接的优势就是容易上手——界面的设计与串口屏自身的一些操作直接在软件上操作即可
最直观的优势就是界面专业化——根据不同主题设计不同风格的界面。
大概可能相较于TFT-LCD显示屏唯一的缺点就是——贵了一些
- HMI串口屏开发实操
1.准备
对串口屏进行开发即设计界面之前,你需要先准备好以下软硬件。
上位软件(开发软件):USART HMI + Framework 3.5(语言开发软件)
链接:http://tjcfile.iicp.net:885/USARTHMI/USARTHMIsetup_1.63.1.exe(Framework无需自己去下载 一般下载的USART HMI时会自动弹出提醒你要下载)
下载工具:①SD卡+读卡器 或 ②USB转串口 或 ③USB转TTL(或!!!!)
2.界面认识
①还未进入HMI文件的页面
先讲解几个常用或比较重要的工具
- 新建/打开文件
- 编译:检查整个项目是否有错 如是否命令格式/使用有错 是否图片坐标值无效等
- 调试:模拟项目
- 下载:前面说的第②种/第③种下载
- 工具:新建字库(如需在串口屏写文字 字库必须有)
- 帮助:有指令集和资料中心。指令集包括其所有的指令指南,资料中心跳转陶晶驰资料中心。有软件下载、工程样例、视频教程、常见问题锦集等。
②进入HMI文件的页面
进入前还需要根据自己的串口屏型号大小进行选择并设置横屏还是竖屏。
3.写命令
帮助的指令集里面有非常完整的指令集,功能如何,如何使用,例程都是比较详细的。这里仅示范几个命令的效果。
- Page 刷新页面
- 工具箱安置随意一个控件(因为 都有按下事件和弹起按键)。在控件属性处改变一些东西让控件更明显/更好看一些。(eg.文本的txt,数字的val,图片的pic)注意!txt、val必须要建字库,pic必须要添加图片。
- 新建一个页面(可自己命名 eg.page1)
- 在命令窗口的弹起事件输入page page1(page是命令 page1是页面名称) 或 page 1(1是页面的id号)
方框圈住为ID号,圆圈圈住为名称
最后一步 调试get√(效果如下)
串口屏刷新页面功能展展示(调试)
·prints 从串口打印一个变量/常量
·printh 从串口打印一个Hex
安置一个数字控件 按下事件如上 弹起事件是n0.val+=1
调试效果如下(详细解释大家就去看help吧 不懂再问哦 大家一定一定要多看help 多写命令!)
【prints返回的变量默认是四个字节整形数据hex数据 储存方式为小端模式 即地位在前
,后面的0作用是发送长度为自动长度即实际长度】
串口屏发送命令功能展示
4.下载
①SD卡+读卡器
串口屏上电:VCC、GND和单片机的5V、GND接好,单片机上电即可,这是一种方式,总之,VCC和GND要对应接好就可以了
文件→输出生产文件(到SD卡、即读卡器插入显示的某盘)→将SD卡插入串口屏→串口屏上电→下载完成100%→串口屏断电→拔SD卡→再上电即可√
注意顺序!SD卡必须在上电前插入,SD卡必须在断电后拔出
- ②/③
-
双向通讯的连接方式 VCC-VCC GND-GND RX-TX TX-RX
- 联机操作 help里面有详细讲
- 软件下载→选择对应串口和波特率→下载(注:速度极慢)
-
先hex发送 ff ff ff(结束之前的指令)
字符串发送(取消hex发送)connect 0xff 0xff 0xff
收到comok 1,101,TJC4024T032_011R,52,61488,D264B8204F0E1828,16777216即为成功
一般串口屏都默认是9600的波特率,下载也可以让它自动搜索
- HMI串口屏与单片机(stm32)双向通讯
1.STM32控制串口屏对应的数值、文本完成相应变化
stm32单向控制只需掌握改变串口屏控件属性的命令,并会用串口将其发送
void HMI_SendNum(USART_TypeDef* USARTx,u8 *data,u8 len,u16 Num,u8 len2)
{
u8 t;
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,data[t]);
}
for(t=0;t<len2;t++)
{
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,'0'+(Num/HMI_Pow(len2-t-1))%10);
}
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0XFF);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0XFF);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0XFF);
}
void HMI_SendText(USART_TypeDef* USARTx,u8 *data,u8 len,u8 *text,u8 len2)
{
u8 t;
for(t=0;t<len;t++)
{
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,data[t]);
}
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0X22);
for(t=0;t<len2;t++)
{
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,text[t]);
}
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0X22);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0XFF);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0XFF);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
USART_SendData(USARTx,0XFF);
}
使用:
HMI_SendText(USART3,"t0.txt=",7,"你真漂亮",8); //一个汉字为两个字节 四个汉字为八个字节
if(Buttonflag) //按键标志
HMI_SendNum(USART3,"q0.picc=",8,5,1);
else
HMI_SendNum(USART3,"q0.picc=",8,4,1);
2.串口屏控制STM32的LED翻转
3. 串口屏通过按键输入数值并发送给单片机,单片机接受并实时显示在串口屏上
实现二者的双向通讯,我们需要制定一个数据格式(方便写代码等)
我制定的数据格式为:
页面 id + 控件id + 十位数值 + 个位数值 + 0D + 0A
0D 0A的作用是什么?
详细大家可以去看stm32基于库函数的usart文件夹介绍
这里简单解释:串口接收到回车(0D 0A)则标记 USART_RX_STA 的第 15 位,这样即为完成一次接收。而我们在执行完相应程序式将该位清除,从而可以开始下一次的接收。
体现在代码中就是
if(USART3_RX_STA&0x8000) //接受完成
{
if(USART3_RX_BUF[0]==0x01&&USART3_RX_BUF[1]==0x03)
{
Event_1(); //事件一
USART3_RX_STA=0; //清除标志位
}
if(USART3_RX_BUF[0]==0x02&&USART3_RX_BUF[1]==0x12)
{
Event_2(); //事件二
USART3_RX_STA=0; //清除标志位
}
if(USART3_RX_BUF[0]==0x03&&USART3_RX_BUF[1]==0x03&&USART3_RX_BUF[2]==0&&USART3_RX_BUF[3]==0)
{
Event_3(); //事件三
USART3_RX_STA=0; //清楚标志位
}
}
既然已经能够顺利接受数据,那我们重点就放在解析数据。
可以设置格式统一的包头(比如get命令它的返回值开头一定是0x70/0x71),通过检测包头以判断
数据是否开始。也可以简单粗暴的直接if,满足返回命令的一段独一无二的值或所有值即可执行操作(函数中写满足我们相应功能的函数 如LED反转、数值计算之后再显示)。由于功能并不复杂,我们选择第二种,简单粗暴。而我们秩序
通常出口屏需要反复调试修改,大家需要熟练掌握调试、利用串口助手监控串口屏往串口发送了什么。(ps:用前面②/③的连接方式,用串口助手监控该串口即可)
最后 如果没有串口屏也没有单片机怎么办?
介绍一种设置虚拟串口以供靠软件即可观察双向通讯的数据。
常用的虚拟串口软件:Virtual Serial Port Driver(VSPD)
下载链接:vspd7.2.308.zip-嵌入式文档类资源-CSDN下载(直接下载!无需积分)
1.将一对串口设置为虚拟串口
2.如图设置(虚拟串口为COM1和COM2)
然后在串口发送就相当于单片机对串口屏发送啦
再补充说一点:
单片机是有很多串口的 我们前面说的VCC-VCC GND-GND RX-TX TX-RX
RX可以是PA10(USART 1) 也可以是 PB11(USART 3)
与之相对应
TX可以是PA9(USART 1) 也可以是 PB10(USART 3)
但是单片机烧入程序是需要PA9与RX PA10与TX相连的
所以我们想让串口屏与之双向通讯的时候还得拔掉跳线帽
所以大家最好用别的串口
最后的最后!
放上对于HMI的资源与单片机和串口屏双向通讯的资源:
同时 点个赞吧~
有什么问题都可以留言问哦!