基于STM32G431嵌入式学习笔记——六、串口中断实例(基于第12届蓝桥杯串口部分题目)

本文详细介绍如何在STM32G431平台上利用串口中断进行编程,包括环境配置、USART初始化、函数实现,以及基于串口通信实现的停车场管理功能,如车位判断、车辆进出、费用计算等。

上一节我们初步了解了中断的配置、串口的调试以及中断处理子程序的定义,接下来我们就来学习一下具体如何去应用串口中断。

一、真题引入

1.功能概述
在这里插入图片描述

2.串口功能
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、环境配置

我们依旧以第四节完成的第12届蓝桥杯节选题为初始环境进行配置,复制出副本改名为USART
在这里插入图片描述

1) CubeMX 初始化 USART1
(一配引脚和异步通讯,二配速率、长度等,三配中断允许和优先级);
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
2) 打开keil,将main.c恢复到两节前的内容
参考原来代码里的全局变量、头文件、函数声明、函数定义进行文件恢复。
这告诉我们编程时及时存档拷贝备份是很重要的!!

三、函数实现
1.led.h led.c key.c key.h

参考基于STM32G431嵌入式学习笔记——四、LED+KEY+LCD综合练习(基于第12届蓝桥杯显示部分题目)

2.busi.h

在书写头文件前,我们首先要考虑关于停车场我们都需要有什么:
各种基本属性(车、时间、停车位);进车库出车库操作还有一些基本的异常处理函数。
因此我们围绕以上设想进行书写。
(1)一些基本属性的定义
车:车的类型 + 车牌号
时间:年月日时秒分
停车位:车 + 停留时间 + 是否有车占据
在这里插入图片描述

(2)相关属性的初始化
在这里插入图片描述

(3)相关异常以及状态判断
在这里插入图片描述

(4)关于停车场会发生的功能函数
在这里插入图片描述

至此busi.h头文件编写完毕,完整代码如下:

//车
typedef struct Car
{
   
   
    char type[5];
    char id[5];
}Car;
//时间
typedef struct Time
{
   
   
    int year,month,day;
    int hour,minute,second;
}Time;
//停车位
typedef struct Parking
{
   
   
    Car car;
    Time time;
    char flag;
}Parking;

//停车场有8个位置
#define PARKING_SIZE 8
//车辆信息初始化
Car CarInit(char* type,char* id);
//时间设置
Time TimeInit(int year,int month,int day,int hour,int minute,int second);
//停车场初始化
void ParkingInit(void);

//判断传入字符串格式是否正确
int DataSplit(void);
//判断当前车位是否是空
int IsEmpty(Parking now);
//判断目前的车是进场还是离场(停车场原来就存在则为离场)
int IsExist(Car oldcar,Car newcar);

//车辆进入停车场
int ParkIn(Parking *park,Car car,Time enter);
//车辆离开停车场
float ParkOut(Parking *park,Car car,Time leave);
//清空某车位信息
void ClearPark(Parking *park,int location);
//串口通信函数
void park_proc(Parking *park,Car car,Time time);
3.busi.c

(1)多个文件都会使用的全局变量定义
当我们想让某个全局变量在同工程不同文件下起到相同作用,则需借助extern来修饰:
在这里插入图片描述
(2)仅在该文件会使用的全局变量定义
在这里插入图片描述
(3)相关属性的初始化
其中strcpy用到了#include "string.h"的头文件
在这里插入图片描述

(4)相关异常以及状态判断
①字符串格式校验
我们会对字符串进行分割拆解,并对分割出来的每一个字符串进行类型的校验。
这里用到了**sscanf( )函数,来自#include “sdtio.h”**的头文件
常见用法如下:
在这里插入图片描述那么这一长长的字符串是从哪里来的呢?我们通过题目可以知道车辆信息是由串口输入的,因此我们需要设置一些与串口通信有关的变量,写入usart.c文件中:
在这里插入图片描述
其中RxLen、TxLen分别为接收信息、发送信息的字符串长度,其定义应在usart.h文件中进行宏定义;
且在刚刚定义的这几个变量我们是会在多个文件中去使用的,因此我们不妨将其在头文件中再次定义(添加extern是代表这个全局变量在每个文件中出现的时候代表的是相同的变量)

如果将extern变量写入某头文件,这样如果我们想在多个.c文件中使用该变量,仅需在对应的文件开头添加#include "某某.h"就好

具体结果如下:
在这里插入图片描述
这时我们便可以在busi.c中调用该头文件,去使用这些串口通信变量(顺便将可能会即将用到的头文件也加入):
在这里插入图片描述

接下来我们就书写函数内容,大体思路就是“分割字符串,匹配字符串,不合要求就返回0,并向串口发送端buffer传入错误提示信息;完全匹配就返回1”
在这里插入图片描述

②判断车位是否为空 ③判断当前车是否与现停的车相同
在这里插入图片描述(5)关于停车场会发生的功能函数
①进入停车场
在这里插入图片描述

②离开停车场 + 清除车位数据
继续跟在上面的函数之后书写就好

//车辆离开停车场
float ParkOut(Parking *park,Car car,Time leave)
{
   
   
    int i,ptime1,ptime2;
    i = ptime1 = ptime2 = 0;
    float price = 0;
    Car oldcar;
    Time oldtime;
    for(i=0;i<8;i++)
    {
   
   
        oldcar = park[i].car;
        oldtime = park[i].time;
        //进入if循环则说明是要从这个位置离开停车场
        if(IsExist(oldcar,car))
        {
   
   
            //判断时间是否合法
            ptime1 = (leave.year - oldtime.year)*365*24 +
                    (leave.month - oldtime.month)*30*24 +
                    (leave.day - oldtime.day)*24 + 
                    (leave.hour - oldtime.hour)*1;
            ptime2 = (leave.minute - oldtime.minute)*60 + 
                    (leave.second - oldtime.second);
            //进入if说明时间不合法
            if(ptime1<0 && ptime2
### 蓝桥杯STM32G431竞赛资料与教程 #### 开发环境配置 为了顺利参与蓝桥杯嵌入式竞赛并使用STM32G431RBT6微控制器,建议采用STM32CubeMX工具来初始化项目设置以及生成初始代码框架[^1]。通过该软件可以轻松完成外设配置如GPIO、定时器等,并自动生成对应于所选硬件抽象层(HAL)库接口函数调用的C语言源文件。 #### 基础功能模块编程指导 针对具体的功能需求,在准备过程中可参照如下资源: - **LED控制**:利用GPIO端口操作实现简单的灯光闪烁效果作为入门练习。 - **LCD显示驱动**:学习如何连接显示屏并与之通信以展示文字或者图形界面。 - **按键扫描逻辑编写**:掌握中断服务程序(ISR)的设计思路用于响应外部输入事件。 - **PWM信号发生器构建**:探索TIMx系列定时器高级特性从而产生精确占空比变化波形输出。 - **模数转换(ADC)**处理技术介绍:了解单次/连续模式下采样过程及其误差校正机制;熟悉`HAL_ADC_Start()`等相关API命令集[^2]。 ```c // 启动一次AD转换 if (HAL_ADC_Start(&hadc1) != HAL_OK){ // 错误处理... } ``` 对于上述各项技能点的学习,推荐参考官方文档中的应用笔记(Application Note),这些材料通常包含了详尽的工作原理说明和技术细节解析,有助于加深理解并提高实际动手能力。 #### 数据传输协议实践案例分享 当涉及到与其他设备间的信息交换时,则需重点研究UART串行通讯方式。这里提供了一个基本的数据发送实例片段供读者借鉴[^4]: ```c char message[] = "Hello Blue Bridge Cup!"; HAL_UART_Transmit(&huart1, (uint8_t*)message,strlen(message), HAL_MAX_DELAY); ``` 此段代码展示了怎样借助预定义好的句柄结构体指针(`&huart1`)配合字符数组形式的消息主体向指定的目标地址传递字符串内容。 #### 综合实战经验交流平台 除了理论知识积累之外,积极参与社区互动也是提升个人技术水平的有效途径之一。例如可以通过论坛帖子的形式发布自己的作品寻求反馈意见或是就某些特定主题展开讨论[^3]。这种开放式的沟通渠道不仅能够促进成员间的相互启发还可能带来意想不到的合作机会。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值