文章目录
数据流
创建 xStreamBufferCreate
StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes,
size_t xTriggerLevelBytes );
参数:
xBufferSizeBytes:buffer的最大容量字节数
xTriggerLevelBytes:最小有效触发字节,意思是,当buffer至少有大于等于这个值的字节数时,消息才能被接收,该值最小为1,如果设置为0,内部会自动将其设置为1
返回值:
NULL:创建失败
发送 xStreamBufferSend
size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
const void *pvTxData,
size_t xDataLengthBytes,
TickType_t xTicksToWait );
参数:
xStreamBuffer:句柄
pvTxData:待发送消息的指针
xDataLengthBytes:拷贝到stream buffer的字节数量
xTicksToWait:stream buffer 满了后发送的等待时间
返回值:
最终拷贝到stream buffer的字节数量
接受 xStreamBufferReceive
size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
void *pvRxData,
size_t xBufferLengthBytes,
TickType_t xTicksToWait );
参数:
xStreamBuffer:句柄
pvRxData:接收buffer的指针
xBufferLengthBytes:一次最大的接收长度
xTicksToWait:等待时间
返回值:
实际接收到的长度
查询流缓冲区 xStreamBufferSpacesAvailable
查询流缓冲区以查看它包含多少可用空间,这等于在流缓冲区满之前可以发送到流缓冲区的数据量。
size_t xStreamBufferSpacesAvailable(StreamBufferHandle_t xStreamBuffer);
参数:
xStreamBuffer 正在查询的流缓冲区的句柄。
返回值:
在流缓冲区满之前可以写入流缓冲区的字节数。
代码示例
#include <stdio.h>
#include <string.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "freertos/stream_buffer.h"
StreamBufferHandle_t StreamBufferHandle = NULL;
void Task1(void *pvParam)
{
int i = 0;
int str_len = 0;
int send_bytes = 0;
char tx_buf[50];
while (1)
{
i++;
str_len = sprintf(tx_buf, "i = %d", i);
send_bytes = xStreamBufferSend(StreamBufferHandle, (void *)tx_buf, str_len, portMAX_DELAY);
printf("----------------!\n");
printf("send: str_len = %d, send_bytes = %d!\n",str_len, send_bytes);
vTaskDelay(pdMS_TO_TICKS(3000));
}
}
void Task2(void *pvParam)
{
char rx_buf[50];
int rec_bytes = 0;
while (1)
{
memset(rx_buf, 0, sizeof(rx_buf));
rec_bytes = xStreamBufferReceive(StreamBufferHandle, (void *)rx_buf, sizeof(rx_buf), portMAX_DELAY);
printf("----------------!\n");
printf("receive: rec_bytes = %d, data { %s }!\n",rec_bytes, rx_buf);
}
}
void Task3(void *pvParam)
{
int buf_space = 0;
int min_space = 1000;
while (1)
{
buf_space = xStreamBufferSpacesAvailable(StreamBufferHandle);
if(buf_space < min_space)
{
min_space = buf_space;
}
printf("----------------!\n");
printf("buf_space = %d, min_space = %d!\n", buf_space, min_space);
vTaskDelay(pdMS_TO_TICKS(3000));
}
}
void app_main(void)
{
StreamBufferHandle = xStreamBufferCreate(1000, 5);
if (StreamBufferHandle != NULL)
{
vTaskSuspendAll();
xTaskCreate(Task1, "Task1", 1024 * 5, NULL, 1, NULL);
xTaskCreate(Task2, "Task2", 1024 * 5, NULL, 1, NULL);
xTaskCreate(Task3, "Task3", 1024 * 5, NULL, 1, NULL);
xTaskResumeAll();
}
else
{
printf("Fail to create stream buffer!\n");
}
}