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

B站Michale_ee——ESP32_IDF SDK——FreeRTOS_8 消息缓冲区

  • Message Buffer(消息缓冲区)与Stream Buffer(流数据缓冲区)类似,但有2点不同:
    • Message Buffer每次只接收1次完整的Message;
    • Message Buffer接收缓冲区小于1条Message大小时,会接收不到数据;

一、Message Buffer每次直接收1条完整的Message

1.API简介

(1)创建Message Buffer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)从消息缓冲区中接收数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)向消息缓冲区中发送数据

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.示例代码及运行结果

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "freertos/message_buffer.h"    // add by lxl
#include "string.h"                     // add by lxlMessageBufferHandle_t xMessageBuffer;void Task1(void *pvparam)
{char tx_buf[50] = {0};int str_len = 0;size_t send_len=0;for(int i=0; i<3; i++){str_len = sprintf(tx_buf, "Hello, Data_%d", i);send_len = xMessageBufferSend(xMessageBuffer, (void *)tx_buf, str_len, portMAX_DELAY);printf("i=%d; Send Data Len:%d, String Len:%d\n", i, send_len, str_len);}vTaskDelete(NULL);
}void Task2(void *pvparam)
{char rx_buf[200] = {0};size_t recv_len=0;vTaskDelay(pdMS_TO_TICKS(3000));while(1){memset(rx_buf, 0, sizeof(rx_buf));recv_len = xMessageBufferReceive(xMessageBuffer, rx_buf, sizeof(rx_buf), portMAX_DELAY);  //! 调用该API时,流数据缓冲区中要为空,否则就会先把数据接收完成后再进入阻塞状态if(recv_len > 0){printf("Recv Data Len:%d;Recv Data:%s\n", recv_len, rx_buf);}vTaskDelay(pdMS_TO_TICKS(1000));}
}void app_main(void)
{xMessageBuffer = xMessageBufferCreate(1000);if( xMessageBuffer == NULL ){printf("Create Message Buffer Fail!\n");}else{vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1);  //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}

在这里插入图片描述

二、Message接收API的接收缓冲区的小于1条Message大小时,会接收不到数据

示例代码及运行结果

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "freertos/Message_buffer.h"    // add by lxl
#include "string.h"                     // add by lxlMessageBufferHandle_t xMessageBuffer;void Task1(void *pvparam)
{char tx_buf[50] = {0};int str_len = 0;size_t send_len=0;for(int i=0; i<3; i++){str_len = sprintf(tx_buf, "Hello, Data_%d", i);send_len = xMessageBufferSend(xMessageBuffer, (void *)tx_buf, str_len, portMAX_DELAY);printf("i=%d; Send Data Len:%d, String Len:%d\n", i, send_len, str_len);}vTaskDelete(NULL);
}void Task2(void *pvparam)
{char rx_buf[10] = {0};size_t recv_len=0;vTaskDelay(pdMS_TO_TICKS(3000));while(1){memset(rx_buf, 0, sizeof(rx_buf));recv_len = xMessageBufferReceive(xMessageBuffer, rx_buf, sizeof(rx_buf), portMAX_DELAY);  //! 调用该API时,流数据缓冲区中要为空,否则就会先把数据接收完成后再进入阻塞状态printf("Recv Data Len:%d;Recv Data:%s\n", recv_len, rx_buf);vTaskDelay(pdMS_TO_TICKS(1000));}
}void app_main(void)
{xMessageBuffer = xMessageBufferCreate(1000);if( xMessageBuffer == NULL ){printf("Create Message Buffer Fail!\n");}else{vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1);  //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}

在这里插入图片描述

http://www.xdnf.cn/news/255241.html

相关文章:

  • 神州趣味地名-基于天地图和LeafLet的趣味地名探索
  • 软件工程中的 QFD
  • 力扣面试150题--分隔链表
  • 深度学习视角下魔幻手机的实现探索与技术实践
  • python常用科学计算库及使用示例
  • 第六章 配置能力增强
  • C语言数据类型与内存布局
  • Linux系统中的用户分类、为什么Linux系统中有很多我没有创建的用户?
  • PyTorch_创建线性和随机张量
  • 数据中台笔记01
  • PaddleOCR移植到RK3568
  • 文章三《机器学习基础概念与框架实践》
  • 【STM32】定时器输入捕获
  • 怎么实现动态提示词,并提升准确率
  • [面试]SoC验证工程师面试常见问题(二)
  • ps将图标变清晰-cnblog
  • MATLAB绘制局部放大图
  • 【Bootstrap V4系列】 学习入门教程之 组件-警告框(Alert)
  • 【DecAlign】用于解耦多模态表征学习的分层跨模态对齐
  • Spring AI:简化人工智能功能应用程序开发
  • 对称加密算法(AES、ChaCha20和SM4)Python实现——密码学基础(Python出现No module named “Crypto” 解决方案)
  • mysql索引及数据库引擎
  • 计算方法实验三 解线性方程组的直接方法
  • C++模板知识
  • 数据库系统概论|第五章:数据库完整性—课程笔记1
  • PostgreSQL 查看表膨胀情况的方法
  • 【算法基础】冒泡排序算法 - JAVA
  • w317汽车维修预约服务系统设计与实现
  • 藏语英语中文机器翻译入门实践
  • 仿腾讯会议——主界面设计创建房间加入房间客户端实现