当前位置: 首页 > 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();}
}

在这里插入图片描述

相关文章:

  • javascript交换值最好三种
  • 计算机网络——客户端/服务端,URI与URL的区别,以及TCP/IP核心机制全解析
  • (36)VTK C++开发示例 ---纹理贴图四边形
  • 【大模型实战篇】对Qwen3提到的thinking和no thinking混合思考模式的讨论
  • Manus AI多语言手写识别技术解析
  • PostgreSQL 的 VACUUM 与 VACUUM FULL 详解
  • 【git】获取特定分支和所有分支
  • 【Linux深入浅出】之全连接队列及抓包介绍
  • 阿里云服务器防御是怎么做出来的?服务器攻击方式有几种?
  • Java文件上传
  • 【算法基础】选择排序算法 - JAVA
  • ARM 指令集(ubuntu环境学习)第六章:ARM 编程技巧与优化策略
  • 供应链算法整理(一)--- 销量预估
  • 如何掌握 Lustre/Scade 同步数据流语言
  • 基于建造者模式的信号量与理解建造者模式
  • 每日算法-250502
  • Python爬虫实战:获取好大夫在线各专业全国医院排行榜数据并分析,为患者就医做参考
  • 传统银行服务和 区块链支付无缝融合的一种解决方案
  • 【AI面试准备】数据治理与GDPR脱敏机制构建
  • 4.Java中的注释
  • 三亚回应“买水果9斤变6斤”:反映属实,拟对流动摊贩罚款5万元
  • 猎金,游戏,诚不我欺
  • “五一”第三天郑州铁路局预计发送旅客76万人
  • 福州交警:一小型汽车因操作不当撞上汽车和电动车,致2人死亡
  • 阿根廷发生5.6级地震,震源深度30公里
  • 思政课也精彩,“少年修齐讲堂”开讲《我的中国“芯”》