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=0
  if(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+=1
  if(n2.val==10)
  {
    // substr t0.txt,t0.txt,n0.val,sys0-n0.val//清空文本内容
    n2.val=1
    t0.txt=t10.txt
    t10.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");

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ipv6简单实验案例

R1配置&#xff1a; ipv6 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address auto global ipv6 route-static 2001:21:: 64 2001:12::1 R2配置&#xff1a; ipv6 dhcp enable dhcpv6 pool test address prefix 2001:21::/64 excluded-address 2001:21::1 interface Gi…

EasyExcel复杂表头数据导入

目录 表头示例导入代码数据导出 表头示例 导入代码 Overridepublic void importExcel(InputStream inputStream) {ItemExcelListener itemExcelListener new ItemExcelListener();EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet()…

深入了解汽车级功率MOSFET NVMFS2D3P04M8LT1G P沟道数据表

汽车级功率MOSFET是一种专门用于汽车电子领域的功率MOSFET。它具有高电压、高电流、高温、高可靠性等特点&#xff0c;能够满足汽车电子领域对功率器件的严格要求。汽车级功率MOSFET广泛应用于汽车电机驱动、泵电机控制、车身控制等方面&#xff0c;能够提高汽车电子系统的效率…

Java进阶(List)——面试时List常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合&#xff0c;需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中List集合的面试问题&#xff0c;结合源码分析题目背后的知识点。 关于的Set的博客文章如下&#xff1a; Java进阶&#xff08;Set&#xff09;——面试时…

9.Vue前端使用iframe集成帆软报表的单点登录

一、背景 需要把帆软报表内嵌到若依里面来。 二、帆软设置 2.1 帆软报表的url 打开帆软后端里面的【目录管理】查看具体报表的url 帆软报表的具体地址为: Frm聚合报表地址: 【帆软的服务http】+【/webroot/decision/view/form?viewlet=demo/demo.frm】 CPT普通报表的地…

【腾讯云 HAI域探秘】使用Stable Diffusion大模型生成惊世骇俗的图片!

文章目录 前言环境准备高性能应用服务 HAI资格申请购买HAI高性能服务 生成图片界面汉化&#xff1a;输入提示词生成图片参数列表&#xff1a;根据提示词生成图片 总结&#xff1a;优点&#xff1a;缺点&#xff1a; 前言 AI绘画工具的发展历史可以追溯到2014年&#xff0c;当时…

SQL INNER JOIN 关键字(内部连接)

SQL INNER JOIN 关键字&#xff08;内部连接&#xff09; 内部链接INNER JOIN关键字选择两个表中具有匹配值的记录。 SQL INNER JOIN 语法 SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name table2.column_name; 注释&#xff1a;INNER JOIN 与 …

4.多层感知机-3GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 多层感知机一、感知机1、感知机2、训练感知机3、图形解释4、收敛定理5、XOR问题6、总结 二、多层感知机1、XOR2、单隐藏层3、单隐藏层-单分类4、为什么需要非线性激活函数5、Sigmoid函数6、Tanh函数7、ReLU函数8、多类分…

MFC 窗体插入图片

1.制作BMP图像1.bmp 放到res文件夹下&#xff0c;资源视图界面导入res文件夹下的1.bmp 2.添加控件 控件类型修改为Bitmap 图像&#xff0c;选择IDB_BITMAP1 3.效果

【嵌入式开发学习】__软件工程师的关键原则-18个系统设计概念

目录 前言 01. 域名系统 (DNS) 02. 负载均衡器 03. API 网关 04. 内容交付网络 (CDN) 05. 正向代理与反向代理 06. 缓存 07. 数据分区 08. 数据库复制 09. 分布式消息系统 10. 微服务 11. 数据库 12. 前端缓存 13. 后端缓存 14. 安全性 15. 高可用性与容错性 …

都是80m²小户型,凭啥她家那么好看!福州中宅装饰,福州装修

杨桥新苑 本案来自杨桥新苑的住宅&#xff0c; 质朴弥漫在80㎡的小家&#xff0c; 自然淡雅的木纹&#xff0c;精炼的玄关隔断&#xff0c; 简约的设计里传达着中式的静谧风雅&#xff0c; 简练的空间加入中国元素&#xff0c; 让人从进门开始就沾染一丝艺术气息。 风格&a…

Apache Pulsar 在腾讯云上的最佳实践

导语 由 StreamNative 主办的 Pulsar Meetup Beijing 2023 在2023年10月14日完美落幕&#xff0c;本次活动大咖云集&#xff0c;来自腾讯、滴滴、华为、智联招聘、RisingWave 和 StreamNative 的行业专家们一起&#xff0c;深入探讨 Pulsar 在生产环境中的最佳应用实践&#x…

Docker学习——②

文章目录 1、Docker是什么1.1 Docker本质1.2 Docker的引擎迭代1.3 Docker和虚拟机的区别1.4 Docker 为什么比虚拟机资源利用率高&#xff0c;启动快&#xff1f;1.5 Docker 和 JVM 虚拟化的区别&#xff1f; 2、Docker架构3、Docker生态3.1 新时代软件诉求3.2 Docker 解决方案 …

OSPF高级特性1(重发布,虚链路)

目录 OSPF高级特性(1) 一、OSPF不规则区域类型 二、解决方案 1、使用虚连接 演示一&#xff1a;非骨干区域无法和骨干区域保持连通 演示二&#xff1a;骨干区域被分割 2、使用多进程双向重发布 OSPF高级特性(1) 一、OSPF不规则区域类型 产生原因&#xff1a;区…

Linux ---------------------Shell 基本运算符

&#xff08;一&#xff09;摘要 Shell 和其他编程语言一样&#xff0c;支持多种运算符&#xff0c;包括&#xff1a; 算数运算符关系运算符布尔运算符字符串运算符文件测试运算符 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk …

喜讯!苏州箱讯获评苏州市软件和信息服务业 “头雁”培育企业

近日&#xff0c;由中国电子信息产业发展研究院、中国工业经济联合会、国家智能制造专家委员会、国家产业基础专家委员会、江苏省工业和信息化厅、江苏省国有资产监督管理委员会、苏州市人民政府共同主办的2023第三届中控中国大会在苏州太湖国际会议中心举办。 本届大会以“生态…

零基础成人英语哪里可以学,柯桥成人英语培训

写作中经常会用到“有利于”的表达&#xff0c;一说到“有利于”&#xff0c;大家最先想到的是 be good for 或者 benefit&#xff0c;很滥&#xff0c;很简单&#xff0c;没有亮点&#xff0c;写作中很难提分。 还有一点&#xff0c;英文写作中很忌讳相同的表达反复出现&…

Vue3入门指南:零基础小白也能轻松理解的学习笔记

文章目录 创建项目开发环境项目目录模板语法属性绑定条件渲染列表渲染事件处理内联事件处理器方法事件处理器&#xff08;常用&#xff09; 事件参数获取 event 事件事件传参 事件修饰符阻止默认事件阻止事件冒泡 数组变化侦测变更方法替换一个数组 计算属性class 绑定单对象绑…

【Python】多进程线程与CPU核数

多进程数量设置为CPU核数&#xff0c;或者略小于CPU核数&#xff1b;多线程数量&#xff0c;如果是CPU密集任务设为1&#xff1b;如果是IO密集设为合理的值&#xff1b;IO密集型&#xff1a;系统运作&#xff0c;大部分的状况是CPU 在等I/O &#xff08;硬盘/内存&#xff09;的…