- 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();}
}