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