蓝桥杯物联网竞赛 比赛总结

2024-06-07 08:04

本文主要是介绍蓝桥杯物联网竞赛 比赛总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CUBEMX配置建议:

对于CUBEMX配置来说stm32l071kbu6的引脚不算太多,功能模块相对的也不多,所以我建议直接熟练到能将所有模块烂熟于心,不用看原理图就能熟练配置下来,因为国赛看原理图去配置太花费时间
我建议学习的时候先将原理图看懂,哪个模块干嘛的什么原理搞懂,到后面做题就用简便方式配置

物联网竞赛板CubMx全部功能简洁配置汇总

代码书写建议:

代码书写我目前认为最高效的写法是:

在这里插入图片描述
在这里插入图片描述
我建议main函数只填写一些基础的头文件,以及初始化,通过MyMain函数接口运行我们的代码

在这里插入图片描述
将要运行的代码写在自己定义的.c文件里,通过MyMain接口函数调到main函数中运行,这样的好处是需要修改函数或查找BUG的时候直接把范围锁定在自己的Function.c文件

为了更好的书写代码,确保代码的正确性,可以把题目中要求的基本模块先写出来,运行检查一下确保没有问题,例如比赛题目中有OLED显示功能,可以先把OLED功能写出来后,随便显示一个字符串,显示成功说明OLED配置以及代码没问题,如果后面运行主代码的时候发现改显示的数据没有显示的时候,那就自然而然排除是OLED配置和代码问题,就缩小了查BUG的范围

这就更加突出代码模块化的优势,将一个复杂的过程分开成两个或多个小的模块去完成,可以更好的去测试各个模块的完成情况

那么多个模块是怎么连接成小模块的呢?
这就需要全局变量来连接,全局变量的好处是,变量是公共的,模块A处理后模块B也可以处理

在这里插入图片描述
在这里插入图片描述
例如脉冲显示的时候我先用模块A采集数据,再用模块B处理数据并显示,期间还能单独对两个模块进行调试

在这里插入图片描述
定义好全局变量确保A和B函数都能访问

当然不是所有的参数都应该定义成全局变量,全局变量内部数据如果有时不清理的话,会导致数据的污染,例如第一次接收111到全局变量DATA内第二次接收99那么显然数据会被污染成991这个显然是期望之外的

解决方法,如果这个变量只有一个函数模块使用的话,那就设置成私有变量例如:

void OLED_Write(unsigned char type, unsigned char data){unsigned char WriteData[2];WriteData[0] = type;WriteData[1] = data;HAL_I2C_Master_Transmit(&hi2c3, 0x78, WriteData, 2, 0xff);
}

如果确实需要多个模块配合处理的话也可以定义一个清理函数,处理完后不需要就处理掉

void Function_ArrayClean(unsigned char* array, uint16_t len){for(unsigned char i = 0; i < len; i ++) array[i] = '\0';
}

调试是必不可少的,为了更高效的调试,我建议要么用debug调试,这个我用的不多,后端调试用的多,嵌入式还是喜欢用OLED显示参数,因为直观那么操作就是OLED_ShowString配合sprintf显示对应参数数值,这个我感觉及其不方便,特别是代码量很多的时候需要多次使用sprintf与OLED_ShowString

我建议结合sprintf和showstring函数直接重构一个myprintf函数

#include <stdarg.h>
void myprintf(unsigned char address, const char* format, ...) {char ARRAY[40];// 使用va_list和va_start来处理可变参数va_list args;va_start(args, format);// 使用vsprintf将可变参数列表格式化的字符串存储到ARRAY中vsprintf(ARRAY, format, args);// 清理可变参数列表va_end(args);// 假设OLED_ShowString函数可以在OLED屏幕上显示字符串OLED_ShowString(address, (unsigned char*)ARRAY);
}

这个函数真是很简单就是处理后面的...不定参数,然后交给vsprintf字符串化,总体效果和printf几乎一模一样,无论调试还是显示都是非常的好用强烈建议学习这个重构方法

蓝桥杯物联网竞赛_STM32L071_20_用printf将数据显示在OLED上


当然以上都是我学习蓝桥杯物联网竞赛这一路以来的经验和技巧吧,在这里仅供参考,毕竟适合自己的才是最好的。那么我的蓝桥杯物联网竞赛就到此结束了,祝福诸君顺利。

—— 2024/6/6

这篇关于蓝桥杯物联网竞赛 比赛总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038599

相关文章

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO