STM32F4与串口屏通信

news2025/3/25 2:18:01

淘晶池串口屏操作指令集

那我们就来谈一谈串口屏与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,假设与串口屏连接的是串口1
    HAL_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':
                // 执行操作A
                break;
            case 'B':
                // 执行操作B
                break;
            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);

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

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

相关文章

车载以太网网络测试-20【传输层-DOIP协议-3】

1 摘要 本文继续对ISO 13400-2定义的节点管理报文进行介绍,主要对路由激活请求/响应报文以及在线检查请求/响应报文的作用、帧结构以及示例进行介绍。 上文回顾: 车载以太网网络测试-19【传输层-DOIP协议-2】 在进行详细介绍之前,还是先回顾…

`chromadb` 是什么

chromadb 是什么 chromadb 是一个开源的向量数据库,它专门用于存储、索引和查询向量数据。在处理自然语言处理(NLP)、计算机视觉等领域的任务时,通常会将文本、图像等数据转换为向量表示,而 chromadb 可以高效地管理这些向量,帮助开发者快速找到与查询向量最相似的向量数…

关于“碰一碰发视频”系统的技术开发文档框架

以下是关于“碰一碰发视频”系统的技术开发文档框架,涵盖核心功能、技术选型、开发流程和关键模块设计,帮助您快速搭建一站式解决方案 --- 随着短视频平台的兴起,用户的创作与分享需求日益增长。而如何让视频分享更加便捷、有趣&#xff0c…

vue3之写一个aichat---已聊天组件部分功能

渲染聊天数据 这个不必多说,直接从stores/chat中取出聊天列表数据渲染就好,因为前面添加的消息都是按照用户消息、AI助手消息这样添加的,效果如图 但是需要注意每条助手消息的状态,需要根据状态显示不同的图标或不显示图标&…

基于STC89C51的太阳自动跟踪系统的设计与实现—单片机控制步进电机实现太阳跟踪控制(仿真+程序+原理图+PCB+文档)

摘 要 随着我国经济的飞速发展,促使各种能源使用入不敷出,尤其是最主要的能源,煤炭石油资源不断消耗与短缺,因此人类寻找其他替代能源的脚步正在加快。而太阳能则具有无污染﹑可再生﹑储量大等优点,且分布范围广&…

第五: redis 安装 / find 查找目录

redis 安装的 两种方式: mac上安装redis的两种方法_如何在mac上安装redis-CSDN博客 首先可以先看一下brew的常用命令如下: brew search ** //查找某个软件包 brew list //列出已经安装的软件的包 brew install ** //安装某个软件包,默认安装的是…

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…

星越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)是现代企业数字化转型中的关键概念,二者既有紧密关联又各有侧重。以下从定义、核心内…

CCBCISCN复盘

AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…

糊涂人寄信——递推

思路分析:当有n封信,n个信封时。第k封信没有装在第k个信封里(k从1~n),就算所有的信封都装错了。我们可以得知的是,当有1封信,时,装错类别数为0。当有两封信时,装错类别为1。 当有三…

使用 OpenCV 拼接进行图像处理对比:以形态学操作为例

图像处理在计算机视觉中起着至关重要的作用,而 OpenCV 作为一个强大的图像处理库,提供了丰富的函数来实现各类图像处理任务。形态学操作(Morphological Operations)是其中常用的技术,尤其适用于二值图像的处理。常见的…

OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)

文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…

Python数据可视化实战:从基础图表到高级分析

Python数据可视化实战:从基础图表到高级分析 数据可视化是数据分析的重要环节,通过直观的图表可以快速洞察数据规律。本文将通过5个实际案例,手把手教你使用Python的Matplotlib库完成各类数据可视化任务,涵盖条形图、堆积面积图、…

在 Elasticsearch 中扩展后期交互模型 - 第 2 部分 - 8.18

作者:来自 Elastic Peter Straer 及 Benjamin Trent 本文探讨了如何优化后期交互向量,以适应大规模生产工作负载,例如减少磁盘空间占用和提高计算效率。 在之前关于 ColPali 的博客中,我们探讨了如何使用 Elasticsearch 创建视觉搜…

蓝桥每日打卡--区间移位

#蓝桥#JAVA#区间移位 题目描述 数轴上有n个闭区间:D1,⋯Dn。 其中区间Di用一对整数[ai,bi]来描述,满足 ai≤bi。 已知这些区间的长度之和至少有。 所以,通过适当的移动这些区间,你总可以使得他们的"并"覆盖 [0,],也…