USART HMI串口屏+单片机通讯上手体验

USART HMI串口屏+单片机通讯上手体验


  • 🔖本文采用淘晶驰4.3寸IPS串口屏实物验证,HMI串口屏经简单配置即可快速实现,串口通讯效果。串口屏上手简单,有独立的开发套件,容易上手,驱动显示和功能代码独立。本文仅针对串口调试信息显示实现做介绍,不涉及复杂功能实现。
  • 🎞打印输出效果:
    在这里插入图片描述
    在这里插入图片描述

🌼模拟类似于通过电脑上位机串口调试助手,打印调试信息的效果。由于所使用的模块不带RTC,不然可以将接收数据的时间信息也可以添加上去。

  • 🌿串口屏相关资料下载:http://wiki.tjc1688.com/download/index.html

串口协议解析方式

  • 🚩串口协议模式:0-代表字符串指令协议;1-代表主动解析协议。
    在这里插入图片描述
    • 🌿字符串指令协议接收数据格式:t10.txt=\"数据内容\r\n\"\xff\xff\xff
    • 🌿主动解析协议接收数据格式:"数据内容\r\n\",(至于数据内容赋值给哪个对象,根据个人开发而定),该种解析方式,可以参考官方的《解析不定长字符串(以回车换行结尾)》来实现。

📑串口屏幕显示开发简介

  • 🌿依托上位机软件USART HMI来完成开发,以及模拟和程序下载。软件开发界面比较简单,以功能控件作为基础+逻辑表达来实现所需的功能。
    在这里插入图片描述
  • 🔧作为串口调试信息显示,我主要是使用了文本控件+组织的逻辑代码来实现的。
    在这里插入图片描述
  • 🌿逻辑代码的组织,只需要有一点C语言基础的都可以上手,按照官方提供基本逻辑表达式语法即可实现,所需要使用到的关键字比C语言少的多。
  • 🌿接线方式,仅需5V供电线和串口线,4条线即可,如果只做单向通讯显示,屏幕和单片机之间,3条线就可以了。
  • 🌿单片机和屏幕通过串口通讯,波特率一定要匹配,如果两者都是采用独立独立供电方式,那么还需要需要共GND处理。

📓文本控件功能介绍

  • 📌官方介绍:http://wiki.tjc1688.com/widgets/Text.html
  • 单片机如何对文本控件赋值
  1. 在上位机工程新建一个文本控件,假设为t0,将程序下载到串口屏上,
  2. 串口屏串口与单片机串口连接,两者波特率应一致,单片机RX接串口屏TX,单片机TX接串口屏RX。
  3. 发送指令:单片机串口通过字符串模式发送t0.txt=”六六六”

//注意arduino需要注意编码,因为arduino的默认编码是utf-8,串口屏默认编码是gb2312,请保证单片机与串口屏的编码相同,否则串口屏会显示乱码,或者不显示

  1. 发送结束符:单片机通过HEX模式发送0xff 0xff 0xff
  2. 此时屏幕上的t0控件内的文字变为“六六六”
  • 📜文本控件-如何换行
    如果是上位机软件中直接使用多行编辑,直接按回车可以换行.
    在控件的事件中给文本赋值时用\r,例如t0.txt=”123\r456”
    单片机通过串口发送给屏幕时用\r\n,例如printf(t0.txt=”123\r\n456”)

  • 📋文本数据-显示不完全

  1. 文本数据长度不够(检查txt_maxl属性,即划给文本控件的字节长度)GB2312编码下,一个英文或者数字占1个字节,一个中文占2个字节;utf-8编码下,一个英文或者数字占1个字节,一个中文占3个字节
  • 🔨解决方法:将控件txt_maxl改大。
  1. 字库中没有某些字,双击相应的字库可以预览字库,显示字库中有哪些字
  2. 控件属性w,h设置过小导致没办法显示全。
    解决方法:将控件属性w,h改大。
  3. 控件调用字库字符编码和工程设备字符编码不一致。
    解决方法:将工程设备字符编码设置和控件调用的字库字符编码一致。
  4. 字符编码不支持这个字。
    解决方法:p图片来显示这个字。

⛳作为串口数据显示实时性实现

  • ✨让接收到的串口数据按照先后顺序,实时显示,需要用到定时器控件,来实现对已接收到的数据进行处理。
  • 🌿串口文本显示界面,定时器实现页面内所有文本控件内容的更新显示,定时器逻辑实现:
btlen t10.txt,n1.val//获取当前接收到的数据长度
if(n1.val>1)
{n1.val=0if(n2.val==0){t0.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==1){t2.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==2){t3.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==3){t4.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==4){t5.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==5){t6.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==6){t7.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==7){t8.txt=t10.txt//将文本赋值为空t10.txt=""}if(n2.val==8){t9.txt=t10.txt//将文本赋值为空t10.txt=""}n2.val+=1if(n2.val==10){// substr t0.txt,t0.txt,n0.val,sys0-n0.val//清空文本内容n2.val=1t0.txt=t10.txtt10.txt=""t2.txt=""t3.txt=""t4.txt=""t5.txt=""t6.txt=""t7.txt=""t8.txt=""t9.txt=""}
}

🏳‍🌈单片机端串口数据打印格式

  • 🌿基于stm32单片机,Keil开发环境:
printf("t10.txt+=\"STM32F303 SysClk:%u\r\n\"\xff\xff\xff", SysClk);printf("t10.txt+=\"Hello World%d\r\n\"\xff\xff\xff", cnt);
int main(void)
{/* USER CODE BEGIN 1 */uint16_t cnt = 0;uint32_t TimerUART;char str[32];/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */uint32_t SysClk = HAL_RCC_GetSysClockFreq();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if((HAL_GetTick() - TimerUART) > 1000){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
//            HAL_Delay(1000);printf("t10.txt+=\"STM32F303 SysClk:%u\r\n\"\xff\xff\xff", SysClk);HAL_Delay(500);cnt++;printf("t10.txt+=\"Hello World%d\r\n\"\xff\xff\xff", cnt);
//            sprintf(str, "t10.txt+=\"Hello World%d\r\n\"\xff\xff\xff", cnt);
//            printf("%s", str);
//            memset(str, 0, 32);TimerUART = HAL_GetTick();}}/* USER CODE END 3 */
}
  • 🌿基于Arduino平台
Serial.print("t10.txt+=\"from Arduino UNO\r\n\"\xff\xff\xff");
  • 测试程序:
#include <SoftwareSerial.h>
SoftwareSerial TJC(8,9);//8:RxD,9:TxD
//unsigned long nowtime;
unsigned int cnt;
void setup() {// put your setup code here, to run once:Serial.begin(9600);//初始化串口TJC.begin(9600);pinMode(LED_BUILTIN, OUTPUT);//因为串口屏开机会发送88 ff ff ff,所以要清空串口缓冲区while (TJC.read() >= 0); //清空串口缓冲区
//nowtime = millis(); //获取当前已经运行的时间
}void loop() {char str[32];cnt++;sprintf(str, "t10.txt+=\"Hello World%d\r\n\"\xff\xff\xff", cnt);// put your main code here, to run repeatedly:digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));delay(1000);TJC.print(str);delay(1000);
//  Serial.print("t10.txt+=\"from Arduino UNO\r\n\"\xff\xff\xff");
TJC.print("t10.txt+=\"from Arduino UNO\r\n\"\xff\xff\xff");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021上半年下午网络工程师试题

2021上半年下午网络工程师试题 试题一(共20分) 阅读以下说明&#xff0c;回答问题1至问题4&#xff0c;将解答填入答题纸对应的解答栏内。 【说明】 某企业网络拓扑图如图1-1所示。该网络可以实现的网络功能有: 1.汇聚层交换机A与交换机B采用VRRP技术组网&#xff1b; 2.…

PerfectPixel 插件,前端页面显示优化工具

1.简介 PerfectPixel 插件是一款适用于 Chrome 浏览器的网页前端页面显示优化工具&#xff0c;该插件能够帮助开发人员和标记设计人员在开发时将设计图直接加载至网页中&#xff0c;与已成型的网页进行重叠对比&#xff0c;以规范网页像素精度 作为一款可以优化前端页面显示的…

VSCode 设置平滑光标

1.点击左下角的设置按钮&#xff0c;再点击设置 2.点击文本编辑器&#xff0c;点击光标&#xff0c;勾选控制是否启用平滑插入动画。 3.随便打开一个文件&#xff0c;上下左右移动光标时&#xff0c;会发现非常的流畅。 原创作者&#xff1a;吴小糖 创作时间&#xff1a;2023…

【纹理展开和纹理映射】

纹理展开和纹理映射 1.Projective Urban Texturing (blenderopengl)2.Text2Tex (xatlaspytorch3D)3.自己的理解4.纹理展开和纹理映射&#xff0c;它们可逆吗&#xff1f; 前言 &#xff1a;最近突然意识到纹理展开和纹理映射并非一个东西&#xff0c;遂进行了一些了解&#xff…

[PHP]帮管客CRM客户管理系统 v5.1.0

帮管客CRM客户管理系统基于先进的CRM营销理念设计&#xff0c;集客户档案、销售记录、业务往来于一身&#xff0c;以凝聚客户关系、提升资源价值为核心&#xff0c;将潜在客户变为现实客户、从而提升销售量、提高用户的满意度&#xff0c;并增加企业竞争力。帮管客CRM是适用于中…

基于transformer的解码decode目标检测框架(修改DETR源码)

提示:transformer结构的目标检测解码器,包含loss计算,附有源码 文章目录 前言一、main函数代码解读1、整体结构认识2、main函数代码解读3、源码链接二、decode模块代码解读1、decoded的TransformerDec模块代码解读2、decoded的TransformerDecoder模块代码解读3、decoded的De…

《现代C++语言核心特性解析》笔记(一)

一、新基础类型&#xff08;C11&#xff5e;C20&#xff09; C基础类型回顾一览表 1. 整数类型 long long 我们知道long通常表示一个32位整型&#xff0c;而long long则是用来表示一个64位的整型。不得不说&#xff0c;这种命名方式简单粗暴。不仅写法冗余&#xff0c;而且表…

MuLogin浏览器如何在一台设备上安全登录和管理多个LinkedIn账户?

一、LinkedIn多个账户的用处 LinkedIn作为世界上最大的专业人士社交平台&#xff0c;具有许多有用的功能&#xff0c;对于个人和企业来说都非常重要。以下是多个LinkedIn账户的一些典型用途&#xff1a; 1. 分行业账户&#xff1a;如果您在不同的行业从事职业活动&#xff0c…

【多线程面试题二十二】、 说说你对读写锁的了解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说说你对读写锁的了解 …

华纳云:centos系统中怎么查看cpu信息?

在CentOS系统中&#xff0c;我们可以使用一些命令来查看CPU的详细信息。下面介绍几个常用的命令&#xff1a; 1. lscpu lscpu命令可以显示CPU的架构、型号、核心数、线程数、频率等信息。 # lscpu 执行以上命令后&#xff0c;会输出类似以下内容&#xff1a; 2. cat /proc/…

【C/C++】继承中同名成员处理方式

一、继承中同名成员处理方式 问题&#xff1a;当子类与父类出现同名的成员&#xff0c;如何通过子类对象&#xff0c;访问到子类或父类中同名的数据呢&#xff1f; 访问子类同名成员 直接访问即可访问父类同名成员 需要加作用域 示例&#xff1a; class Base { public:Base…

Pinia和Vuex有什么区别?

Pinia和Vuex有什么区别&#xff1f; 在Vue.js应用程序中&#xff0c;状态管理是确保组件之间数据共享和通信的关键部分。两个主要的状态管理库是Pinia和Vuex。Pinia是一个相对较新的库&#xff0c;而Vuex则是Vue.js社区中使用最广泛的状态管理工具之一。 1. 简介 1.1 Vuex …

金蝶云星空表单插件获取日期控件判空处理(代码示例)

文章目录 金蝶云星空表单插件获取日期控件判空处理C#实现 金蝶云星空表单插件获取日期控件判空处理 C#实现 DateTime? deliveryDate (DateTime?)this.View.Model.GetValue("FApproveDate");//审核日期long leadtime 20;//天数if (!deliveryDate.IsNullOrEmpty()…

在IDEA运行spark程序(搭建Spark开发环境)

建议大家写在Linux上搭建好Hadoop的完全分布式集群环境和Spark集群环境&#xff0c;以下在IDEA中搭建的环境仅仅是在window系统上进行spark程序的开发学习&#xff0c;在window系统上可以不用安装hadoop和spark&#xff0c;spark程序可以通过pom.xml的文件配置&#xff0c;添加…

Java 的高性能缓存库-caffeine!

在项目中用到的除了分布式缓存&#xff0c;还有本地缓存&#xff0c;例如&#xff1a;Guava、Encache&#xff0c;使用本地缓存能够很大程度上提升程序性能&#xff0c;本地缓存是直接从本地内存中读取&#xff0c;没有网络开销。 今天给大家介绍一个高性能的 Java 缓存库 – …

C++设计模式_26_设计模式总结

本篇为C++设计模式的总结课,此篇再回到原帮助大家梳理一下。 文章目录 1. 一个目标2. 两种手段3. 八大原则4. 重构技法5. 从封装变化角度对模式分类6. C++对象模型7. 关注变化点和稳定点8. 什么时候不用模式9. 经验之谈10. 设计模式成长之路1. 一个目标 管理变化,提高复用!…

认证授权--越权访问测试用例

漏洞名称 越权访问 漏洞描述 越权访问&#xff0c;这类漏洞是指应用在检查授权&#xff08;Authorization&#xff09;时存在纰漏&#xff0c;使得攻击者在获得低权限用户帐后后&#xff0c;可以利用一些方式绕过权限检查&#xff0c;访问或者操作到原本无权访问的高权限功能…

Angular组件生命周期详解

当 Angular 实例化组件类 并渲染组件视图及其子视图时&#xff0c;组件实例的生命周期就开始了。生命周期一直伴随着变更检测&#xff0c;Angular 会检查数据绑定属性何时发生变化&#xff0c;并按需更新视图和组件实例。当 Angular 销毁组件实例并从 DOM 中移除它渲染的模板时…

Ubuntu 使用 nginx 搭建 https 文件服务器

Ubuntu 使用 nginx 搭建 https 文件服务器 搭建步骤安装 nginx生成证书修改 config重启 nginx 搭建步骤 安装 nginx生成证书修改 config重启 nginx 安装 nginx apt 安装&#xff1a; sudo apt-get install nginx生成证书 使用 openssl 生成证书&#xff1a; 到对应的路径…

智能化的宠物喂食器解决方案

随着经济条件的不断改善&#xff0c;越来越多的家庭开始追求生活的便捷享受&#xff0c;于是喂食器开始走进千家万户&#xff0c;喂食器主要由储存食物的蓄食箱和传送食物的滑道构成&#xff0c;在外部框架的支撑下&#xff0c;一台喂食器才能正常进行工作&#xff0c;而宠物喂…