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
- 单片机如何对文本控件赋值
- 在上位机工程新建一个文本控件,假设为t0,将程序下载到串口屏上,
- 串口屏串口与单片机串口连接,两者波特率应一致,单片机RX接串口屏TX,单片机TX接串口屏RX。
- 发送指令:单片机串口通过字符串模式发送t0.txt=”六六六”
//注意arduino需要注意编码,因为arduino的默认编码是utf-8,串口屏默认编码是gb2312,请保证单片机与串口屏的编码相同,否则串口屏会显示乱码,或者不显示
- 发送结束符:单片机通过HEX模式发送0xff 0xff 0xff
- 此时屏幕上的t0控件内的文字变为“六六六”
-
📜文本控件-如何换行
如果是上位机软件中直接使用多行编辑,直接按回车可以换行.
在控件的事件中给文本赋值时用\r,例如t0.txt=”123\r456”
单片机通过串口发送给屏幕时用\r\n,例如printf(t0.txt=”123\r\n456”) -
📋文本数据-显示不完全
- 文本数据长度不够(检查txt_maxl属性,即划给文本控件的字节长度)GB2312编码下,一个英文或者数字占1个字节,一个中文占2个字节;utf-8编码下,一个英文或者数字占1个字节,一个中文占3个字节
- 🔨解决方法:将控件txt_maxl改大。
- 字库中没有某些字,双击相应的字库可以预览字库,显示字库中有哪些字
- 控件属性w,h设置过小导致没办法显示全。
解决方法:将控件属性w,h改大。 - 控件调用字库字符编码和工程设备字符编码不一致。
解决方法:将工程设备字符编码设置和控件调用的字库字符编码一致。 - 字符编码不支持这个字。
解决方法: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");}
相关文章:

USART HMI串口屏+单片机通讯上手体验
USART HMI串口屏单片机通讯上手体验 🔖本文采用淘晶驰4.3寸IPS串口屏实物验证,HMI串口屏经简单配置即可快速实现,串口通讯效果。串口屏上手简单,有独立的开发套件,容易上手,驱动显示和功能代码独立。本文仅…...

Linux进程概念(1)
📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容为进程的概念做铺垫,主要介绍冯诺依曼体系结…...

uniapp 查看安卓第三方插件抛出的异常
0.安装好andriod studio 和hbuilder 1.配置环境变量 鼠标右键此电脑-》设置》关于》高级系统设置》环境变量》系统变量》path中加入 具体的hbuildr adb目录看个人 2.在cmd中输入命令adb version 查看是否配置成功 出现版本号就是配置成功了 3.去hbuilder中,导航栏运…...

美妆造型教培服务预约小程序的作用是什么
美业市场规模很高,细分类目更是比较广,而美妆造型就是其中的一类,从业者也比较多,除了学校科目外,美妆造型教培机构也有生意。 对机构来说主要目的是拓客引流-转化及赋能,而想要完善路径却是不太容易&…...
Pytorch常用函数
Pytorch 1 一些操作含义2 常用函数torch.squeezetorch.unsqueezetorch.transpose随机数生成Tensor详细内容 1 一些操作含义 下划线后缀含义: 在touch中函数后面加下划线代表是原位(In-place)操作,也就是内存的位置不变化,比如torch.add(valu…...

如何利用python连接讯飞的星火大语言模型
星火大模型是科大讯飞推出的一款人工智能语言模型,它采用了华为的昇腾910 AI处理器。这款处理器是一款人工智能处理器,具有强大的计算能力和高效的能耗控制能力。 华为昇腾910 AI处理器采用了创新的Da Vinci架构,这种架构在设计上充分考虑了…...

【Kubernetes 基本概念】Kubernetes 的架构和核心概念
目录 一、Kurbernetes1.1 简介1.2 为什么要用K8s?1.3 K8s的特性 二、Kurbernetes集群架构与组件三、Kurbernetes的核心组件3.1 Master组件3.1.1 Kube-apiserver3.1.2 Kube-controller-manager3.1.3 Kube-scheduler 3.2 配置存储中心——etcd3.3 Node组件3.3.1 Kubelet3.3.2 Ku…...
Docker安装部署Elasticsearch+Kibana+IK分词器
Docker安装部署ElasticsearchKibanaIK分词器 Docker安装部署elasticsearch拉取镜像创建数据卷创建网络elasticsearch容器,启动! Docker安装部署Kibana拉取镜像Kibana容器,启动! 安装IK分词器安装方式一:直接从github上…...

PCL setCameraPosition 参数讲解
setCameraPosition 的原型如下void setCameraPosition (double pos_x, double pos_y, double pos_z,double view_x, double view_y, double view_z,double up_x, double up_y, double up_z, int viewport 0);pos_x pos_y pos_z为相机所在的位置view_x view_y view_z 是焦点所…...

有关YOLOV5在测试时,图片大小被调整的问题
执行detect.py文件,在运行栏中出现以下: detect: weightsyolov5s.pt, sourcedata\images, datadata\coco128.yaml, imgsz[640, 640], conf_thres0.25, iou_thres0.45, max_det1000, device, view_imgFalse, save_txtFalse, save_confFalse, save_cropFa…...

【机器学习】四、计算学习理论
1 基础知识 计算学习理论(computational learning theory):关于通过“计算”来进行“学习”的理论,即关于机器学习的理论基础,其目的是分析学习任务的困难本质,为学习算法体统理论保证,并根据结…...

spring解决后端显示时区的问题
spring解决后端显示时区的问题 出现的问题: 数据库中的数据: 解决方法 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: Asia/Shanghai...

大模型冷思考:企业“可控”价值创造空间还有多少?
文 | 智能相对论 作者 | 叶远风 毫无疑问,大模型热潮正一浪高过一浪。 在发展进程上,从最开始的技术比拼到现在已开始全面强调商业价值变现,百度、科大讯飞等厂商都喊出类似“不能落地的大模型没有意义”等口号。 在模型类型上࿰…...

ctfshow-web入门37-52
include($c);表达式包含并运行指定文件。 使用data伪协议 ?cdata://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg 是<?php system(cat flag.php);?> base64加密 源代码查看得到flag 38 多禁用了ph…...
前端项目部署后,需要刷新页面才能看到更新内容
问题背景 前端项目部署更新后,通知业务验证,业务点击收藏的标签,打开网页后没有看到修改的内容,每次都需要手动刷新,用户体验非常不好。 问题原因:缓存未过期,浏览器直接读取本地缓存…...

android 13 write javaBean error at *** 错误
报错代码:红框处。 注意:android10 不会报错,运行正常。android13就报错 错误原因:对象中VerifyDownloadEntity,有个Bitmap成员变量 public class VerifyDownloadEntity {private Bitmap bitmap;private String cooki…...
Only fullscreen opaque activities can request orientation
出现Only fullscreen opaque activities can request orientation是谷歌爸爸在安卓8.0版本时为了支持全面屏,增加了一个限制:如果是透明的Activity,则不能固定它的方向,因为它的方向其实是依赖其父Activity的(因为透明…...

前端实验(一)单页面应用的创建
实验目的 掌握使用vite创建vue3单页面程序命令熟悉所创建程序的组织结构熟悉单页面程序运行原理能够编写简单的单页面程序 实验内容 创建一个名为vue-demo的单页面程序编写简单的单页面程序页面运行单页面程序 实验步骤 使用vite创建单页面程序 创建项目名为目录vue-demo的…...

数字人小灿:始于火山语音,发于 B 端百业
火爆的数字人市场又有新消息来袭:火山语音的数字人小灿来了! 数字人小灿首曝视频 今年以来,在生成式AI浪潮的助推下,大量企业争相布局数字人赛道。市场之所以如此火热,是因为AI数字人已被视为人工智能时代智能交互的入…...

蓝桥杯刷题
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 👉🏻最大降雨量 原题链接࿱…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...

一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网(IIoT)场景中,结合 DDS(Data Distribution Service) 和 Rx(Reactive Extensions) 技术,实现 …...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...