STM32F4与串口屏通信
淘晶池串口屏操作指令集
那我们就来谈一谈串口屏与STM32F4嵌入式板子的通信


第一,串口屏传输数据给F4板子
这时,我们就该来谈一谈prints函数和printh函数的用法
prints att,length



att:变量名称
length:长度(0为自动长度)
printh hex


hex:需要发送的字符的16进制字符串表达式(每个字节之间用空格隔开)
sprintf(msg, "funct0.b9.txt=\"-%d%s\"", items[opt].step, items[opt].unit);
含sprintf( )的语句都是从单片机发送信息到串口屏并修改串口屏上对应值的代码段,其中func0.b9.txt指的是串口屏上位机程序中func0页面b9模块的文本txt值,也就是说这段代码将串口屏所显示的func0.b9.txt值用“-%d%s”覆盖,其中%d和%s分别是items[opt].step,items[opt].unit的值。
串口屏-单片机的交互流程是:在串口屏上用你配置的虚拟键盘输入数据 -> 输入数据以字符形式从串口屏传给单片机 -> 单片机内部存储该数据 -> 单片机将数据发送回串口屏并在屏幕上进行显示。
将数据发送回串口屏只是为了便于观察和调试,实际上是利用串口屏为单片机内部变量赋新值。
prints函数具体用法:
这里参考一下SpeedyDashie博主:
使用prints函数发送定长为2的字符串,并规定第一个字符为操作位,第二个字符为具体操作值,这样在代码中也比较便于处理。
其中lenth部分写0则代表发送整个完整的字符串,不过由于代码是处理定长数据的,为了防止溢出,建议仍对lenth写2,即发送2字节。注意所发送数据需要带“ ”号,否则会被当作数值类型发送。
对于从单片机回传数据至串口屏,数据的结束符为“0XFF 0XFF 0XFF”三个字节。
示例1:发送字符串
假设要发送字符串"hello",可以这样用prints函数:
prints"hello",5
这里"hello"是要发送的字符串,5表示字符串的长度(5个字符)。串口屏会通过串口将5个字符发送出去。
示例2:发送变量值
如果有变量temp存储了温度值,要将其发送出去,可以这样使用:
prints temp.val,2
假设temp.val的值为25(十进制),那么串口屏会发送两个字节的数据,即19 00(假设以小端格式发送16位数值)。
示例3:结合帧头和帧尾发送数据
在一些通信协议中,可能需要在数据前后添加帧头和帧尾标识。例如,发送一个以0x55开头,以0xff 0xff 0xff结尾的数据帧,其中包含一个变量data的值,可以这样编写:
printh 55 //发送帧头
prints data.val,2 //发送data变量的值,假设是16位数据
printh ff ff ff //发送帧尾
这样串口屏会先发送0x55作为帧头,然后发送data.val的值,最后发送三个0xff作为帧尾
注意事项
-
参数格式:在使用prints函数时,参数之间必须用逗号分隔,且参数的格式要正确。例如,发送字符串时,字符串需要用双引号括起来;发送变量时,要使用变量的正确引用方式。
-
数据类型处理:如果发送的是数值型变量,需要注意其数据类型(如8位、16位、32位等)以及在串口传输中的字节顺序(大端或小端)。
-
帧结构设计:在设计数据帧时,要根据实际的通信需求合理安排帧头、数据内容和帧尾,确保接收端能够正确解析出完整的数据帧。
#include "usart.h"#define RX_BUFFER_SIZE 256 // 接收缓冲区大小
uint8_t RxBuffer[RX_BUFFER_SIZE]; // 接收缓冲区
uint8_t aRxBuffer; // 中间变量,用于存储接收到的一个字节
uint16_t Uart_Rx_Cnt = 0; // 接收计数// 在主函数中初始化串口并开启中断接收
int main(void)
{HAL_Init();SystemClock_Config();MX_USART1_UART_Init(); // 初始化串口1,假设与串口屏连接的是串口1HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); // 开启中断接收while (1){// 主循环中可以处理其他任务}
}// 中断接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{// 检查是否是串口1的中断if (huart->Instance == USART1){if (Uart_Rx_Cnt >= RX_BUFFER_SIZE - 1) // 如果接收缓冲区即将溢出{Uart_Rx_Cnt = 0; // 重置计数memset(RxBuffer, 0x00, sizeof(RxBuffer)); // 清空缓冲区HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10, 0xFFFF); // 发送提示信息}else{RxBuffer[Uart_Rx_Cnt++] = aRxBuffer; // 将接收到的字节存入缓冲区// 判断是否接收到回车换行符(假设串口屏发送数据以回车换行符结束)if ((RxBuffer[Uart_Rx_Cnt - 1] == 0x0A) && (RxBuffer[Uart_Rx_Cnt - 2] == 0x0D)){// 在这里对接收到的数据进行处理DataProcessing(RxBuffer, Uart_Rx_Cnt - 2); // 减去回车换行符的两个字节Uart_Rx_Cnt = 0; // 重置计数memset(RxBuffer, 0x00, sizeof(RxBuffer)); // 清空缓冲区}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); // 继续接收下一个字节}
}// 数据处理函数
void DataProcessing(uint8_t *data, uint16_t length)
{// 根据实际需求对接收到的数据进行处理// 例如,判断数据内容并执行相应操作if (length >= 1){switch (data[0]){case 'A':// 执行操作Abreak;case 'B':// 执行操作Bbreak;default:// 默认操作break;}}
}
第二,F4传输数据给串口屏
#include "stdio.h"
void Uart_printf(UART_HandleTypeDef *huart,char *format, ...)
{
char buf[512];
memset(buf,0x00,sizeof(buf));
va_list ap;
va_start(ap, format);
uint16_t len = vsnprintf((char *)buf, sizeof(buf), (char *)format, ap);
va_end(ap);
HAL_UART_Transmit(huart,(uint8_t *)buf,len,1000);
}
Uart_printf(&huart1,"t0.txt=\"%.3f\"\xff\xff\xff",t0);
相关文章:
STM32F4与串口屏通信
淘晶池串口屏操作指令集 那我们就来谈一谈串口屏与STM32F4嵌入式板子的通信 第一,串口屏传输数据给F4板子 这时,我们就该来谈一谈prints函数和printh函数的用法 prints att,length att:变量名称 length:长度(0为自动长度) printh hex hex:需要发送的…...
车载以太网网络测试-20【传输层-DOIP协议-3】
1 摘要 本文继续对ISO 13400-2定义的节点管理报文进行介绍,主要对路由激活请求/响应报文以及在线检查请求/响应报文的作用、帧结构以及示例进行介绍。 上文回顾: 车载以太网网络测试-19【传输层-DOIP协议-2】 在进行详细介绍之前,还是先回顾…...
`chromadb` 是什么
chromadb 是什么 chromadb 是一个开源的向量数据库,它专门用于存储、索引和查询向量数据。在处理自然语言处理(NLP)、计算机视觉等领域的任务时,通常会将文本、图像等数据转换为向量表示,而 chromadb 可以高效地管理这些向量,帮助开发者快速找到与查询向量最相似的向量数…...
基于深度学习的运动想象脑电信号分类研究
标题:基于深度学习的运动想象脑电信号分类研究 内容:1.摘要 背景:运动想象脑电信号分类在康复医学、人机交互等领域具有重要应用价值,但传统方法在处理复杂脑电信号时存在一定局限性。目的:本研究旨在探索基于深度学习的方法对运动想象脑电信…...
HTML5 Video标签详细教程
HTML5 Video标签详细教程 简介 HTML5引入的<video>标签为网页提供了原生视频播放功能,无需依赖Flash等第三方插件。它使得在网页中嵌入和控制视频内容变得简单而强大。本教程将详细介绍<video>标签的使用方法、属性、事件以及相关技术。 基本用法 最…...
【Hbase】查看所有表
在 HBase 中,查看所有表时,通常不需要指定命名空间,除非有特殊需求或配置。以下是一些具体情况: 默认情况下 • HBase Shell:使用list命令时,默认会列出所有命名空间中的所有表,而不仅仅是默认…...
Java 分布式高并发重试方案及实现
文章目录 Java 分布式高并发重试方案及实现一、重试机制的背景和意义二、基于 Spring Boot 的重试方案实现1. 使用 Spring Retry 实现重试机制添加依赖开启重试功能定义重试逻辑使用重试服务 2. 使用 Fast-Retry 实现高性能重试引入依赖编程式重试注解式重试 三、重试机制的注意…...
Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例)
Spring Boot 集成 Quartz 实现定时任务(Cron 表达式示例) 前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Spring Boot 观察定时任务执行5. Quartz Cron 表达式详解6. 结论 前言 在 Spring Boot 项目中,我们经常…...
关于“碰一碰发视频”系统的技术开发文档框架
以下是关于“碰一碰发视频”系统的技术开发文档框架,涵盖核心功能、技术选型、开发流程和关键模块设计,帮助您快速搭建一站式解决方案 --- 随着短视频平台的兴起,用户的创作与分享需求日益增长。而如何让视频分享更加便捷、有趣,…...
vue3之写一个aichat---已聊天组件部分功能
渲染聊天数据 这个不必多说,直接从stores/chat中取出聊天列表数据渲染就好,因为前面添加的消息都是按照用户消息、AI助手消息这样添加的,效果如图 但是需要注意每条助手消息的状态,需要根据状态显示不同的图标或不显示图标&…...
ffmpeg+ubuntu编译库(完整版本)
个人使用环境: ubuntu desktop 16.04 + ffmpeg 4.2.1创建目录在home目录下创建 ffmpeg_sources:用于下载源文件 ffmpeg_build: 存储编译后的库文件 bin:存储二进制文件(ffmpeg,ffplay,ffprobe,X264,X265等) mkdir ffmpeg_sources ffmpeg_build bin安装依赖 先执行…...
基于STC89C51的太阳自动跟踪系统的设计与实现—单片机控制步进电机实现太阳跟踪控制(仿真+程序+原理图+PCB+文档)
摘 要 随着我国经济的飞速发展,促使各种能源使用入不敷出,尤其是最主要的能源,煤炭石油资源不断消耗与短缺,因此人类寻找其他替代能源的脚步正在加快。而太阳能则具有无污染﹑可再生﹑储量大等优点,且分布范围广&…...
第五: redis 安装 / find 查找目录
redis 安装的 两种方式: mac上安装redis的两种方法_如何在mac上安装redis-CSDN博客 首先可以先看一下brew的常用命令如下: brew search ** //查找某个软件包 brew list //列出已经安装的软件的包 brew install ** //安装某个软件包,默认安装的是…...
c++--vector
1.定义vector vector的定义分为四种 (1)vector() ——————无参构造 (2)vector(size_t n,const value_type& val value_type()) ——————构造并初始化n个val (3)vector(const vector& v1) ———————拷贝构造 (4)vector(inputiterator first,inpu…...
Springboot 项目如何输出优雅的日志
我们先看效果图: 我个人比较喜欢这种格式的日志输出,对其完整; 这种格式其实就是默认的,不需要大家配置任何的 logback-spring 文件和xml中配置日志level 没有做任何多余的配置;...
Linux——进程(5)进程地址空间
先看一个程序和现象 预期现象是,子进程和父进程相互独立,子进程的gval是100,101,102....而父进程一直都是100. 结果我们并不意外,只是我们发现,父子进程的gval的地址是一样的,这有点颠覆我们的认…...
代码随想录_动态规划
代码随想录 动态规划 509.斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n…...
c库、POSIX库、C++库、boost库之间的区别和联系
文章目录 一、区别1. 定义和来源2. 功能范围3. 可移植性4. 语言支持5. 维护和更新 二、联系1. 相互补充2. 部分功能重叠3. 共同促进编程发展4. 代码兼容性 三、总结 一、区别 1. 定义和来源 C 库函数:由 ANSI C 和 ISO C 标准定义,是 C 语言编程的基础…...
Maven常见问题汇总
Maven刷新,本地仓库无法更新 现象 This failure was cached in the local repository and resolution is not reattempted until the update interval of aliyunmaven has elapsed or updates are forced原因 因为上一次尝试下载,发现对应的仓库没有这个maven配置…...
星越L_陡坡缓降使用讲解
目录 1.陡坡缓降 1.陡坡缓降 中控屏下滑-点击陡坡缓降功能 35km/h以下时生效。35km/h-60km/h该功能暂停 60km/h以上该功能关闭...
XSS跨站脚本攻击漏洞(Cross Site Scripting)
前提概要 本文章主要用于分享XSS跨站脚本攻击漏洞基础学习,以下是对XSS跨站脚本攻击漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。 XSS跨站脚本攻击漏洞描述 跨站脚本攻击(XSS)漏洞是一种常见且危害较…...
html5基于Canvas的经典打砖块游戏开发实践
基于Canvas的经典打砖块游戏开发实践 这里写目录标题 基于Canvas的经典打砖块游戏开发实践项目介绍技术栈核心功能实现1. 游戏初始化2. 游戏对象设计3. 碰撞检测系统4. 动画系统5. 用户界面设计 性能优化1. 渲染优化2. 内存管理 项目亮点技术难点突破项目总结 项目介绍 在这个…...
企业信息化的“双螺旋”——IT治理和数据治理
企业信息化的“双螺旋”——IT治理和数据治理 一、核心定义二、关键差异三、内在联系四、实践挑战与融合路径五、行业案例参考六、结论数据治理(Data Governance)和IT治理(IT Governance)是现代企业数字化转型中的关键概念,二者既有紧密关联又各有侧重。以下从定义、核心内…...
设计模式之工厂模式的优缺点
工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离。以下是工厂模式的优缺点: 优点 - 解耦对象的创建和使用:使得代码的依赖关系更加清晰,使用者不需要了解对象的具体创建过程,只需要关心如何使用对象&a…...
CCBCISCN复盘
AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…...
糊涂人寄信——递推
思路分析:当有n封信,n个信封时。第k封信没有装在第k个信封里(k从1~n),就算所有的信封都装错了。我们可以得知的是,当有1封信,时,装错类别数为0。当有两封信时,装错类别为1。 当有三…...
OpenHarmony子系统开发 - 电源管理(一)
OpenHarmony子系统开发 - 电源管理(一) 一、电源模式定制开发指导 概述 简介 OpenHarmony默认提供了电源模式(如正常模式、性能模式、省电模式、超级省电模式)的特性。但由于不同产品的部件存在差异,导致在同样场景…...
使用 OpenCV 拼接进行图像处理对比:以形态学操作为例
图像处理在计算机视觉中起着至关重要的作用,而 OpenCV 作为一个强大的图像处理库,提供了丰富的函数来实现各类图像处理任务。形态学操作(Morphological Operations)是其中常用的技术,尤其适用于二值图像的处理。常见的…...
数据库的左连接,右连接,全外连接,自连接,内连接的区别
从语法层面上看, 全外连接full outer join 左连接是left outer join 右连接是right outer join 内连接是inner join 自连接是自身表与自身表进行的左右连接,需要注意的是并没有左内连接和右内连接。 左外连接 select * from A left outer join B …...
Nexus L2 L3基本配置
接口基本配置 N7K上所有端口默认处于shutdown状态; N5K上所有端口默认处于no shutdown状态(所有端口都是switchport) 默认所有接口都是三层route模式, 只有当线卡不支持三层的时候, 接口才会处于二层switchport模式 show run all | in “system default” 创建SVI口需要提前打…...
