STM32平衡小车01——基于FreeRTOS实现串口接收数据(HC05)

这篇具有很好参考价值的文章主要介绍了STM32平衡小车01——基于FreeRTOS实现串口接收数据(HC05)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CubeMX平衡小车01——基于FreeRTOS实现串口接收数据

一、实现功能及实验环境

1.实现功能

手机数据——>HC05——>USART2——>STM32解析收到的数据——>USART1——>电脑串口软件显示4个SHORT

①数据格式

手机数据为12字节,包头为0xA5、包尾为0x5A、倒数第二位为校验位(为纯数据低八位的和)
stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

②手机端APP

stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

③电脑串口软件显示4个SHORT

stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

2.实验环境

开发板为STM32F103CCU6

连接方式:串口2通过蓝牙HC05接受数据,串口1通过左侧USB口连接电脑
stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

二、串口接收基础

1.阻塞式

占用资源

    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        if(HAL_OK == HAL_UART_Receive(&huart2, (uint8_t *)recv_buff, 12, 0xFFFF))
        {
            //可以自由对recv_buff进行操作
        }
    }

2.中断式

全部放到mian.c中

main()
{
    HAL_UART_Receive_IT(&huart2, (uint8_t *)recv_buff, 12);//开启串口2中断
    while (1)
    {
        //可以进行其他操作
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_Receive_IT(&huart2, (uint8_t *)recv_buff, 12);//开启串口2中断
    if(VerifyData(recv_buff, 12))
    {
        GetPIDFromHC05(recv_buff);
        printf("%d,%d,%d,%d\r\n", PIDFromHC05.BalanceKP, PIDFromHC05.BalanceKD, PIDFromHC05.SpeedKP, PIDFromHC05.SpeedKI);
    }
}

3.DMA式

将中断式中_IT换成_DMA即可,不要忘了在CubeMX中开启串口2的DMA即可

三、串口数据处理

手机端发送
stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

1.校验

只有校验完成,才能认为接受到的数据是我想要的,而不是干扰

/***********************************************************
*@fuction	:VerifyData
*@brief		:对数据进行校验
*@param		:data为数据,dataBIT为位数
*@return	:返回1验证通过
*@author	:--
*@date		:2023-07-19
***********************************************************/

char VerifyData(uint8_t *data, uint8_t dataBIT)
{
    uint8_t sumdata = 0;
    int datak;
    if(data[0] == 0xa5 && data[dataBIT - 1] == 0x5a)//首先确保包头、包尾是对的
    {
        for(datak = 1; datak < 10; datak++)
        {
            sumdata = sumdata + data[datak];
        }
        if(sumdata == data[datak])//校验和也是对的
        {
            return 1;
        }
        return 0;
    }
    return 0;
}

2.取数据

定义结构体

struct HC05_PID_DATA
{
	uint8_t LedStatus;
	short BalanceKP;
	short BalanceKD;
	short SpeedKP;
	short SpeedKI;	
};
struct HC05_PID_DATA PIDFromHC05;

利用结构体取数据

void GetPIDFromHC05(uint8_t *data)
{
    PIDFromHC05.LedStatus = data[1];
    PIDFromHC05.BalanceKP = data[3] << 8 | data[2];
    PIDFromHC05.BalanceKD = data[5] << 8 | data[4];
    PIDFromHC05.SpeedKP = data[7] << 8 | data[6];
    PIDFromHC05.SpeedKI = data[9] << 8 | data[8];
}

四、FreeRTOS二值信号量

1.在CubeMX中设置,直接在keil中生成

stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

#include "cmsis_os.h"
extern osSemaphoreId_t myBinarySem_rxokHandle;

2.释放二值信号量

osSemaphoreRelease(myBinarySem_rxokHandle); //释放二值信号量 

这个要放在中断中
stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

3.等待二值信号量

osSemaphoreAcquire(myBinarySem_rxokHandle,osWaitForever);//等待二值信号量,只有等到了才会往下运行

stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

我对二值信号量的理解:我认为就是一个信号FLAG,中断来了就发个信号,这个信号相当于一个全局变量

五、CubeMX设置

1.串口1设置

串口1不需要额外设置,波特率调为115200即可
stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

2.串口2设置

串口2需开启DMA
stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

3.freertos设置

任务随便设置几个,二值信号量参照第四部分
stm32 freertos 串口接收数据,cubemx,平衡小车,stm32,单片机,嵌入式硬件

六、程序编写

1.main.h

/* USER CODE BEGIN Includes */
#include "myUsart.h"
#include "bluetooth_hc05.h"
/* USER CODE END Includes */

2.main.c

/* USER CODE BEGIN Includes */
uint8_t buf[12];
#include "cmsis_os.h"
extern osSemaphoreId_t myBinarySem_rxokHandle;
/* USER CODE END Includes */

/* USER CODE BEGIN 0 */
extern struct HC05_PID_DATA PIDFromHC05;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    HAL_UART_Receive_DMA(&huart2, buf, 12);
    if(VerifyData(buf, 12) == 1)
    {
        GetPIDFromHC05(buf);
        osSemaphoreRelease(myBinarySem_rxokHandle); //释放二值信号量       
    }
}
/* USER CODE END 0 */

    /* USER CODE BEGIN 2 */
    HAL_UART_Receive_DMA(&huart2, buf, 12);
    printf("HC05 FreeRTOS TEST\r\n");
    /* USER CODE END 2 */

3.myUsart.c

#include "myUsart.h"
#include "stm32f4xx_hal.h"
#include "usart.h"
#ifdef __GNUC__
	#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
	#else
		#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{	
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}

4.bluetooth_hc05.c文章来源地址https://www.toymoban.com/news/detail-777316.html

#include "bluetooth_hc05.h"
struct HC05_PID_DATA PIDFromHC05;

char VerifyData(uint8_t *data, uint8_t dataBIT)
{
    uint8_t sumdata = 0;
    int datak;
    if(data[0] == 0xa5 && data[dataBIT - 1] == 0x5a)
    {
        for(datak = 1; datak < 10; datak++)
        {
            sumdata = sumdata + data[datak];
        }
        if(sumdata == data[datak])
        {
            return 1;
        }
        return 0;
    }
    return 0;
}

void GetPIDFromHC05(uint8_t *data)
{
    PIDFromHC05.LedStatus = data[1];
    PIDFromHC05.BalanceKP = data[3] << 8 | data[2];
    PIDFromHC05.BalanceKD = data[5] << 8 | data[4];
    PIDFromHC05.SpeedKP = data[7] << 8 | data[6];
    PIDFromHC05.SpeedKI = data[9] << 8 | data[8];
}

omHC05.LedStatus = data[1];
    PIDFromHC05.BalanceKP = data[3] << 8 | data[2];
    PIDFromHC05.BalanceKD = data[5] << 8 | data[4];
    PIDFromHC05.SpeedKP = data[7] << 8 | data[6];
    PIDFromHC05.SpeedKI = data[9] << 8 | data[8];
}

到了这里,关于STM32平衡小车01——基于FreeRTOS实现串口接收数据(HC05)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32-F401的平衡小车

    目录 一、控制系统设计 1.1机械结构设计 1.2传感系统设计 1.3执行器设计 1.4控制算法设计 二、控制系统的制作与调试 2.1机械结构的制作与调试 2.2电路系统的制作与调试 2.3控制程序的编写与调试 三、控制系统的测试与分析 3.1测试方法 3.2测试数据与现象 3.3结果分析 一个系统

    2024年02月06日
    浏览(50)
  • 基于STM32的平衡小车设计过程分享(1)

    一、简介 接触STM32开发一段时间了,想用STM32做一个有意思的项目,经历了无数的调参调参再调参,终于让它站稳了,接一下就一步步的跟大家介绍一下,项目的整体实现过程— 二、项目介绍     STM32平衡小车是一种基于STM32芯片的智能小车,它可以通过自动控制来保持平衡

    2024年02月05日
    浏览(58)
  • [CubeMX项目]基于STM32的平衡小车(硬件设计)

    一直以来我都想在本科毕业前完成一个电机相关的实验,之前看了网上比较火热的自平衡莱洛三角形项目后,决心先做一个类似的小项目。因此,我通过学习大量前辈的项目案例,完成了该项目。 本项目的特点是:在需要通信的部分,全部采用STM32自带的硬件接口,使用自己

    2024年02月03日
    浏览(46)
  • 从零复刻平衡小车(基于STM32F1)

    本项目是对b站up主的开源项目进行了复刻,平衡车也特别适合作为入门单片机了解控制原理的一个小项目,这里主要记录复刻的过程与心得。         所需工具:焊烙铁、热风枪         首先焊单片机最小系统,包括原理图中的最小系统、电源以及串口通信部分。        

    2023年04月15日
    浏览(52)
  • 基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)

    首先选好自己的板子并打开软件设置,本实验基于STM32F103ZET6实现,打开软件后如图: 打开外部高速晶振,然后接着配置时钟: 将时钟频率修改为72MHz,接着设置接线方式为SW 接下来需要使用串口中断通讯,打开我们的串口设置并打开中断 这里波特率设置为115200,数据位为

    2024年02月09日
    浏览(47)
  • 毕业分享 stm32智能平衡小车设计与实现

    文章目录 0 前言 1 项目背景 2 设计思路 3 硬件设计 4 软件设计 4.2 直立控制程序设计 4.3 速度控制程序设计 4.4 方向控制程序设计 4.5 关键代码 5 最后 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这

    2024年02月02日
    浏览(53)
  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    ✨申明:本文章仅发表在 CSDN 网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 📌相关参考《HAL库教程9:串口接收不定长数据》 🎉对于串口接收不定长数据的处理方案网上有很多,个人觉得采用定时

    2024年02月09日
    浏览(56)
  • 毕设开源 基于stm32的智能平衡小车 - 单片机 物联网嵌入式

    文章目录 0 前言 1 项目背景 2 设计思路 3 硬件设计 4 软件设计 4.2 直立控制程序设计 4.3 速度控制程序设计 4.4 方向控制程序设计 4.5 关键代码 5 最后 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这

    2024年02月22日
    浏览(64)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

    2024年02月05日
    浏览(72)
  • STM32实现DMA接收串口数据

    一..首先我们得配置DMA和USARAT,我们的原理是DMA1的通道5为USART1的RX引脚。  1.USART1的配置 2.DMA的配置 二.中断进行数据处理(stm32f10x_it.c) 我们可以串口打印出数组中的数据,验证DMA是否正常工作。可以到数据处理那个地方进行处理。USART1在初始化中就已经波特率为115200.我们可以

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包