/*
程序: Message Buffer
基于Stream Buffer上实现的, 在传输的时候用4个字节记录了sent的内容大小
这样子读取的话,也可以一次读取对应大小的数据
所以很适合 串口 接收和发送数据,每次的大小不定,但是接受和发送的数据量需要相同
公众号:孤独的二进制
*/
//不要忘记include message_buffer.h
#include <freertos/message_buffer.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
MessageBufferHandle_t xMessageBuffer = NULL;
void readGPS(void * pvParam) {
size_t xBytesSent; //The number of bytes written to the message buffer.
String gpsInfo;
while (1) {
gpsInfo = randomGPS(); //随机发送不同长度的信息
xBytesSent = xMessageBufferSend( xMessageBuffer,
( void * ) &gpsInfo,
sizeof( gpsInfo ),
portMAX_DELAY );
if ( xBytesSent != sizeof( gpsInfo ) )
{
Serial.println("危险: xMessageBufferSend 发送数据不完整");
}
vTaskDelay(3000);
}
}
void showGPS(void * pvParam) {
size_t xReceivedBytes;
String gpsInfo;
const size_t xMessageSizeMax = 100;
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" GPS INFO"); //clear this line
while (1) {
xReceivedBytes = xMessageBufferReceive( xMessageBuffer,
( void * ) &gpsInfo,
xMessageSizeMax, //This sets the maximum length of the message that can be received.
portMAX_DELAY );
if ( xReceivedBytes > 0 )
{
gpsDecoder(gpsInfo); //解码,并且显示到屏幕上
}
vTaskDelay(1000);
}
}
void monitorTask (void * pvParam) { //对 streamBuffer进行监控
size_t xAvailable, xUsed;
bool isFull;
while (1) {
//Queries a stream buffer to see if it is full.
if (xMessageBufferIsFull(xMessageBuffer) == pdTRUE) Serial.println("xMessageBuffer 已满");
//Queries a stream buffer to see how much free space it contains
xAvailable = xMessageBufferSpacesAvailable(xMessageBuffer);
char msg[40];
sprintf(msg, "xMessageBuffer可用空间为 %d 字节", xAvailable);
Serial.println(msg);
vTaskDelay(1000);
}
}
void setup()
{
Serial.begin(115200);
const size_t xMessageBufferSizeBytes = 100;
xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes );
if ( xMessageBuffer == NULL )
{
Serial.println("Unable to Create Message Buffer");
}
else
{
xTaskCreate(readGPS, "Read GPX", 1024 * 4, NULL, 1, NULL);
xTaskCreate(showGPS, "Show GPX", 1024 * 4, NULL, 1, NULL);
xTaskCreate(monitorTask, "Monitor Message Buffer", 1024 * 8, NULL, 1, NULL); //对Stream Buffer进行监控
}
}
void loop() {
// String gpsinfo = randomGPS();
// Serial.println(gpsinfo);
// gpsDecoder(gpsinfo);
// delay(1000);
}