基于HMI串口屏的协议(STM32)
基于HMI串口屏的协议(STM32)
提示:
硬件:STM32H750VBT6、USART_HMI(3.5寸基本型)(TJC4832T035_011X)
官方资料网站:HMI
文章目录
- 基于HMI串口屏的协议(STM32)
- 前言
- 一、协议
- 二、协议示例
- 三、协议程序
- 1、`Hmi_Agreements.c`
- 2、`Hmi_Agreements.h`
- 四、使用说明
- 1、接收数据
- 2、发送数据
- 五、下载方式
前言
一、协议
提示:此处仅作为演示,完整版在文章末尾会有下载方式
注:一帧完整的数据一共有7Byte
,所以在发送功能类数据时需要把其他位用0x00
补全。
数据的缩放等级有0x00
、0x01
、0x02
三个等级,分别对应数据扩大0倍
、数据扩大10倍
、数据扩大100倍
。数据采用低端模式,即低字节在地址的低地址中,(例如:发送0x43AA
,则协议中的数据位的顺序是AA
43
,所以在单片机解析数据中需要注意)。STM32
也是采用小端模式。
二、协议示例
在调试的时候可以把这些数据采用上位机的形式发送给单片机。
三、协议程序
1、Hmi_Agreements.c
代码如下(示例):
#include "hmi_agreement.h"
#include "stdlib.h"
#include "stdio.h"_usarthmi UHMI;// _User HMI_User; //用户数据/******************************
**** 函数功能:HMI复位
**** 形参: 无
**** 返回值: 无
*******************************/
void HMI_Usart_Rest(void) //显示屏复位
{uint8_t End_Bit[3] = {0xff,0xff,0xff};uint8_t Rest[4] = "rest";HAL_UART_Transmit(&uart, (uint8_t*)&Rest, 4, 0xffff); //发送数据HAL_UART_Transmit(&uart, (uint8_t*)&End_Bit, 3, 0xffff); //发送结束位
}/******************************
**** 函数功能:刷新HMI界面
**** 形参: Page:需要刷新的页面(字符串形式)
**** 返回值: 无
*******************************/
void HMI_Usart_Refresh(uint8_t *Page) //刷新页面
{uint8_t End_Bit[3] = {0xff,0xff,0xff};uint8_t Head[5] = "page ";uint8_t *str;uint16_t size = strlen((char*)Page);str = (uint8_t*)malloc(size + 5); //申请内存if(str != NULL) //申请内存成功{// sprintf((char*)str,"%s %s",Head,Page);memcpy(str,Head,5);memcpy(str + 5,Page,size); HAL_UART_Transmit(&uart, (uint8_t*)str, size + 5, 0xffff); //发送数据HAL_UART_Transmit(&uart, (uint8_t*)&End_Bit, 3, 0xffff); //发送结束位free(str); //释放内存}
}// /******************************
// **** 函数功能:发送数据到HMI屏幕
// **** 形参: SData:需要发送的数值(字符串形式)
// **** 返回值: 无
// *******************************/
// void HMI_Usart_SendDataValue(uint8_t *SData) //串口发送数值数据到HMI屏幕
// {// uint8_t End_Bit[3] = {0xff,0xff,0xff};
// HAL_UART_Transmit(&uart, (uint8_t*)&SData, strlen((char*)SData), 0xffff); //发送数据
// HAL_UART_Transmit(&uart, (uint8_t*)&End_Bit, sizeof(End_Bit), 0xffff); //发送结束位
// }/******************************
**** 函数功能:隐藏或显示控件
**** 形参: Obj:控件名字,State:状态(1,显示。0,隐藏)
**** 返回值: 无
*******************************/
void HMI_Usart_ShowHideobj(uint8_t *Obj,uint8_t State) //对指定的控件的显示和隐藏进行操作
{uint8_t End_Bit[3] = {0xff,0xff,0xff};uint8_t Sho[4] = "vis ";uint8_t *str;uint16_t size = sizeof(Obj);str = (uint8_t*)malloc(size + 6);if(str != NULL){memcpy(str,Sho,4);memcpy(str + 4,Obj,size);memcpy(str + 4 + size,(uint8_t*)",",1);if(State)memcpy(str + 5 + size,(uint8_t*)"1",1);elsememcpy(str + 5 + size,(uint8_t*)"0",1);HAL_UART_Transmit(&uart, (uint8_t*)str, size + 6, 0xffff); //发送数据HAL_UART_Transmit(&uart, (uint8_t*)&End_Bit, 3, 0xffff); //发送结束位free(str); //释放内存}
}/******************************
**** 函数功能:发送字符数据到HMI
**** 形参: Head:控件的名字,SData:显示的字符
**** 返回值: 无
*******************************/
void HMI_Usart_SendDataText(uint8_t *Head, uint8_t *SData) //串口发送字符数据到HMI屏幕
{uint8_t End_Bit[3] = {0xff,0xff,0xff};uint8_t *str;uint16_t size1 = strlen((char*)Head);uint16_t size2 = strlen((char*)SData);str = (uint8_t*)malloc(size1 + size2 + 3);if(str != NULL){memcpy(str,Head,size1);memcpy(str + size1,(uint8_t*)"=",1);memcpy(str + size1 + 1,(uint8_t*)"\"",1);memcpy(str + size1 + 2,SData,size2);memcpy(str + size1 + size2 + 2,(uint8_t*)"\"",1);HAL_UART_Transmit(&uart, (uint8_t*)str, size1 + size2 + 3, 0xffff); //发送数据HAL_UART_Transmit(&uart, (uint8_t*)&End_Bit, 3, 0xffff); //发送结束位free(str); //释放内存}
}/******************************
**** 函数功能:发送数据到控件(value)
**** 形参: Head:控件的名字,data:数据
**** 返回值: 无
*******************************/
void HMI_Usart_SendDataValue(uint8_t *Head, int16_t data)
{uint8_t End_Bit[3] = {0xff,0xff,0xff};uint8_t buf[10];uint8_t *str;uint16_t size1 = strlen((char*)Head);sprintf((char*)&buf,"%d",data);uint16_t size2 = strlen((char*)buf);str = (uint8_t*)malloc(size1 + 1);if(str != NULL){memcpy(str,Head,size1);memcpy(str + size1,(uint8_t*)"=",1);str = (uint8_t*)realloc(str,size1 + 1 + size2); //再申请内存memcpy(str + size1 + 1, buf,size2);HAL_UART_Transmit(&uart, (uint8_t*)str, size1 + size2 + 1, 0xffff); //发送数据HAL_UART_Transmit(&uart, (uint8_t*)&End_Bit, 3, 0xffff); //发送结束位free(str); //释放内存}
}/******************************
**** 函数功能: 数据解算
**** 形参: _DA接收到的数据
**** 返回值: 数据
*******************************/
static float ResolvingData(uint8_t *_DA)
{int16_t DataBUf = 0;switch (_DA[2]) //数据缩放等级(0(0),1(10),2(100)){case _1E_0: //无缩放DataBUf = *((int16_t*)(&_DA[3]));return (float)DataBUf; //解算数据case _1E_1: //10倍缩放DataBUf = *((int16_t*)(&_DA[3]));return (float)DataBUf / 10.f; //解算数据case _1E_2: //100倍缩放DataBUf = *((int16_t*)(&_DA[3]));return (float)DataBUf / 100.f; //解算数据default:return -1.f;}
}/******************************
**** 函数功能: 接收数据处理
**** 形参: _DA接收到的数据
**** 返回值: 无
*******************************/
static void Acceptance_Data(uint8_t *_DA)
{float DataBuf = 0;DataBuf = ResolvingData(_DA); //数据解算if(DataBuf != -1) //解算成功{UHMI.ID = _DA[1]; switch (_DA[1]) //数据ID{case _INT_VAID1: UHMI._IntRecData->_Data01 = (int16_t)DataBuf; break;case _INT_VAID2: UHMI._IntRecData->_Data02 = (int16_t)DataBuf; break;case _INT_VAID3: UHMI._IntRecData->_Data03 = (int16_t)DataBuf; break;case _INT_VAID4: UHMI._IntRecData->_Data04 = (int16_t)DataBuf; break;case _INT_VAID5: UHMI._IntRecData->_Data05 = (int16_t)DataBuf; break; //整型数据case _FLO_VAID1: UHMI._FloatRecData->_Data10 = DataBuf; break;case _FLO_VAID2: UHMI._FloatRecData->_Data20 = DataBuf; break;case _FLO_VAID3: UHMI._FloatRecData->_Data30 = DataBuf; break;case _FLO_VAID4: UHMI._FloatRecData->_Data40 = DataBuf; break;case _FLO_VAID5: UHMI._FloatRecData->_Data50 = DataBuf; break; //小数数据}}
}/******************************
**** 函数功能:HMI接收数据函数
**** 形参: RData:接收到的数据
**** 返回值: 无
*******************************/
void HMI_Usart_ReciveData(uint8_t *RData,uint8_t size)
{if(size == 7) //数据长度正确{if(RData[0] == 0xCC) //数值类帧,帧头正确Acceptance_Data(RData); //数据处理else if(RData[0] == 0xDD) //功能类,帧头正确HMI_Usart_FunctionSelect(&RData[1]); //功能执行}
}/******************************
**** 函数功能:HMI功能类执行函数选择
**** 形参: Rfun:接收的数据
**** 返回值: 无
*******************************/
void HMI_Usart_FunctionSelect(uint8_t *Rfun)
{switch (*Rfun){case Start: UHMI.StartFlag = 1; break; case Stop: UHMI.StartFlag = 0; break;case mode1: UHMI.Mode = 1; break;case mode2: UHMI.Mode = 2; break;case mode3: UHMI.Mode = 3; break;case mode4: UHMI.Mode = 4; break;case mode5: UHMI.Mode = 5; break;default: UHMI.Mode = 0; UHMI.StartFlag = 0; break;}
}
2、Hmi_Agreements.h
代码如下(示例):
#ifndef __HMI_AGREEMENT_H
#define __HMI_AGREEMENT_H #include "stm32h7xx.h" // Device header
#include "stdio.h"
#include "string.h"
#include "usart.h"#define uart huart2 //使用的串口
#define _DataNum 5 //可接收数据数量 enum _Var
{Start = 0x00,Stop = 0x01, //工作状态mode1 = 0x11,mode2 = 0x12,mode3 = 0x13,mode4 = 0x14,mode5 = 0x15, //模式_1E_0 = 0, //数据缩放等级_1E_1,_1E_2,_INT_VAID1 = 0x01, //整型数据ID_INT_VAID2,_INT_VAID3,_INT_VAID4,_INT_VAID5,_FLO_VAID1 = 0x10, //小数数据ID_FLO_VAID2,_FLO_VAID3,_FLO_VAID4,_FLO_VAID5,
};struct IntRecData //接收的数据缓存(整数)
{int16_t _Data01;int16_t _Data02;int16_t _Data03;int16_t _Data04;int16_t _Data05;
};struct FloatRecData //接收的数据缓存(小数)
{float _Data10;float _Data20;float _Data30;float _Data40;float _Data50;
};typedef struct
{uint8_t StartFlag; //程序开始运行标志位uint8_t ID; //数据ID uint8_t Mode; //工作模式struct IntRecData _IntRecData[_DataNum/5]; //接收的数据结构体struct FloatRecData _FloatRecData[_DataNum/5]; //接收的数据结构体
}_usarthmi;extern _usarthmi UHMI;/********************** 用户上传指令 ********************/void HMI_Usart_Rest(void); //HMI显示屏复位
void HMI_Usart_Refresh(uint8_t *Page); //HMI刷新页面
void HMI_Usart_SendDataValue(uint8_t *Head, int16_t data); //串口发送数据到HMI屏幕
void HMI_Usart_SendDataText(uint8_t *Head, uint8_t *SData); //串口发送字符数据到HMI屏幕
void HMI_Usart_ShowHideobj(uint8_t *Obj,uint8_t State); //对指定的控件的显示和隐藏进行操作/********************* 用户接收数据处理 *******************/static float ResolvingData(uint8_t *_DA); //数据解算
static void Acceptance_Data(uint8_t *_DA); //接收数据处理/********************* 用户可调用的函数 *******************/void HMI_Usart_ReciveData(uint8_t *RData,uint8_t size); //HMI接收数据函数
void HMI_Usart_FunctionSelect(uint8_t *Rfun); //HMI功能类执行函数选择#endif
四、使用说明
1、接收数据
本程序暂未采用DMA
形式发送接收数据,只需在串口回调函数中调用数据接收处理函数
void HMI_Usart_ReciveData(uint8_t *RData,uint8_t size)
接收的数据会分为两类:整型和浮点型的数据,整型数据保存在以下结构体中:
struct IntRecData //接收的数据缓存(整数)
{int16_t _Data01;int16_t _Data02;int16_t _Data03;int16_t _Data04;int16_t _Data05;
};
浮点型数据保存在以下结构体中:
struct FloatRecData //接收的数据缓存(小数)
{float _Data10;float _Data20;float _Data30;float _Data40;float _Data50;
};
他们的ID
与HMI
发送的数据的ID
相同(注:发送时整型和浮点型数据开始的ID
不一样)
而他们都在以下结构体中:
typedef struct
{uint8_t StartFlag; //程序开始运行标志位uint8_t ID; //数据ID uint8_t Mode; //工作模式struct IntRecData _IntRecData[_DataNum/5]; //接收的数据结构体struct FloatRecData _FloatRecData[_DataNum/5]; //接收的数据结构体
}_usarthmi;
2、发送数据
发送数据可使用以下函数:
void HMI_Usart_SendDataValue(uint8_t *Head, int16_t data); //串口发送数据到HMI屏幕
void HMI_Usart_SendDataText(uint8_t *Head, uint8_t *SData); //串口发送字符数据到HMI屏幕
五、下载方式
有积分的同学可以用csdn
下载哦,没积分的同学可以去我GitHub
仓库下载
基于HMI串口屏的协议(STM32)相关推荐
- STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...
- STM32物联网项目-HMI串口屏
HMI串口屏实验 串口屏 屏幕使用的是淘晶池的串口屏,显示内容可以通过官方上位机来编辑,屏幕学习平台:http://wiki.tjc1688.com/doku.php?id=start 通信原理:屏幕 ...
- 51单片机驱动HMI串口屏,串口屏的下载方式
51单片机驱动HMI串口屏,串口屏的下载方式 串口屏 串口屏的程序下载 51程序 总结 串口屏 串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串 ...
- 连接串口_气压计PTB330连接HMI串口屏
本篇约1700字10图 分享人:张彦飞 (菏泽) ---全文概述 这是一篇"小创造"的开发经验分享. 在用振筒气压仪故障,购买新气压显示仪器的申请迟迟未通过,聪明的机务员巧用备件, ...
- 淘晶驰 usart hmi( 串口屏)介绍
usart hmi(串口屏)介绍 https://blog.csdn.net/IRQHandler/article/details/84570463 什么是 HMI HMI是Human Machin ...
- (跨平台UI)单片机用MTF HMI串口屏 UART通信易用兼容
MTF Sagittarius 跨平台串口显示软件 MVVM 组态 MTF Sagittarius Serial Display v1.0 可直接用于产品, 或单片机版的串口屏调试 windows, ...
- usart hmi(串口屏)介绍
什么是 HMI HMI是Human Machine Interface 的缩写, "人机接口" ,也叫人机界面. 什么是usart hmi usart hmi 就是设备封装好 ...
- USART HMI智能串口屏与单片机双向通讯
目录 ·HMI串口屏介绍 ·HMI串口屏开发实操 ·准备 ·界面认识 ·写命令 ·下载 ·HMI串口屏与单片机(stm32)双向通信 [ 功能实现: STM32控制串口屏对应的数值.文本完成相应变化 ...
- 基于STC15W4K48S4芯片的温度检测控制系统(支持手机蓝牙和串口屏的异步串口通信)
目标功能 实现温度的实时检测,并通过两个异步串口将数据发送至串口屏HMI和与蓝牙模块相连接的手机上.支持手机APP和串口屏进行实时的相关数据更改.单片机根据数据要求,当实时温度不在合理范围时,做出应激 ...
最新文章
- 套接字选项SO_LINGER
- 【内网安全】域横向CobalStrikeSPNRDP
- 计算机重装系统知识,电脑重装系统基础知识扫盲贴
- C++ static 用法
- C语言程序返回值为int的时候,不同值代表不同的意义
- 如何在一分钟内实现微服务系统下的架构可视化
- iis设置服务器文件权限设置,iis7如何配置写入权限以上传文件---急急急
- pytorch 关于显存增长原因以及显存占用优化
- QLabel 图片大小设定
- flux服务器推消息,服务端主动推送数据,除了 WebSocket 你还能想到啥?
- 【李宏毅2020 ML/DL】P67-72 Anomaly Detection
- Git Diff 魔法
- Unity3D基础9:获取鼠标键盘输入
- 没有工厂模式(工厂模式2)
- MSCRM4.0商机移除价目表引起的问题
- 阿里巴巴矢量图标 iconfont 下载图标分辨率小一点、并占得内存小一点呢
- Spring 中常用注解原理剖析
- python读取lmdb文件_LMDB 的 Python 接口使用方法
- 图片文字识别 mysql_有道智云OCR图片识别文字+返回数据处理技巧(实现语言-按键精灵脚本请求识别+java服务端处理数据)...
- PRAM模型与Amdahl定律