当前位置: 首页 > article >正文

STM32Cubemx-H7-9-串口接受不定长度数据并识别

前言

使用串口,想要别发“hellow”,我就可以直接返回“world”

当别人多了你名字,等其他长度, 修改起来是不是就会很麻烦了呢?

 你是不是就傻眼了呢

所以就是想通过串口像现实生活中一样,一段时间内,比如一分钟别人把几句话讲完了,那我们就倾听这几句话,然后再根据听到的内容去完成对应的任务

单片机的串口只能一个字一个字的听,那么我们要通过配合定时器,把一分钟内说的话串成一段话

所以就是要串口结合单片机

STM32CUBEMX配置

主要就是串口1打开

和打开定时器中断,我这里是使用定时器2

设定定时时间为10m

定义变量

把tim.h添加到uart.c里面去

#include "tim.h"
    char buffer[1],OUT[100];
    uint8_t flag=0;
    uint32_t length=0,time=0;

这里简单讲,结合串口和定时器中断代码就会理解

其中buffer是串口缓冲,每次接收一个字符

OUT[100]是输出缓存,我设置最大是100个字节

flag是发送标志位,只有串口接收到数据后,标志位为1,定时器检测到标志位为1时才能发送

length是数据长度,每结束后到一个就++

time是时间标志,每10ms++一次,加到10后也就是100ms,如果串口无接收,那么就发送或者执行对应程序

初始化代码编写

使能定时器

  HAL_TIM_Base_Start_IT(&htim2);

使能串口接收

HAL_UART_Receive_IT(&huart1,(uint8_t *)buffer,1);

串口中断代码

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
		if(huart->Instance == USART1)		
    {	 
        OUT[length++]=buffer[0];
        time=0,flag=1;
        HAL_UART_Receive_IT(&huart1,(uint8_t *)buffer,1);
    }
}

OUT用于接收,每次接受就把标志位flag为1,就是表示已经接收过数据,等会要发送的

time每次接收就刷新时间

定时器中断代码

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM2)
    {
        time++;
        if((time>10)&&flag)
        {
            time=0;
            flag=0;
           printf("%s\r\n",OUT);
            if(strcmp(OUT,"led_on")==0)
               HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,0);
              if(strcmp(OUT,"led_off")==0)
            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,1);
           memset(OUT, '\0', sizeof(OUT));
            length=0;
        }
       
    }
}

中断代码的含义就是,如果超过100ms,都没有接收到数据,而且flag为1,说明已经接收到过数据了,那么就代表已经接收完数据了

然后执行自己定义的功能函数

首先是把time和flag清零

然后使用strcmp比较,如果返回0那么代表和自己定义的字符串相等,并执行对应功能

这里就是开灯和关灯

  memset(OUT, '\0', sizeof(OUT));
            length=0;

然后这个是把字符串数组清零,用于下一次接收,要不然原来的数据会被覆盖掉

然后接受长度也清楚为0,

这里的printf()只是我调试使用的功能

效果验证


http://www.kler.cn/a/583977.html

相关文章:

  • 解决 VSCode SSH 连接报错:“REMOTE HOST IDENTIFICATION HAS CHANGED” 的问题
  • Nginx 多协议代理功能(Nginx Multi Protocol Proxy Function)
  • windows11 LTSC 24h2 访问NAS问题的安全高效解决
  • C语言:计算并输出三个整数的最大值 并对三个数排序
  • 图解AUTOSAR_CP_ServiceDiscovery
  • Unix 域套接字(本地套接字)
  • NLP常见任务专题介绍(4)-ConditionalGeneration和CasualLM区别
  • 关于Playwright和Selenium 的区别和选择
  • nginx部署使用【常用命令】
  • C++时间复杂度详解
  • Blackbox.Ai体验:AI编程插件如何提升开发效率
  • Docker 基础命令 - 以 Nginx 实战总结
  • 在Electron-Vue中实现macOS风格自定义标题栏
  • 数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)
  • 【OpenCV C++】存图,如何以时间命名,“年月日-时分秒“产生唯一的文件名呢?“年月日-时分秒-毫秒“ 自动检查存储目录,若不存在自动创建存图
  • 2024年第十五届蓝桥杯软件C/C++大学A组——五子棋对弈
  • 前缀和(例题)
  • availability() missing 2 required positional arguments: ‘host‘ and ‘d‘ 怎么处理
  • ElasticSearch 入门到放弃(持续更新中)
  • JAVA学习-练习试用Java实现“对大数据集中的用户行为数据进行关联规则挖掘和频繁项集筛选”