cestmoi wrote on Tuesday, October 23, 2018:
Hi,
I am working on a project using freeRTOS V10.0.0. on a Arduino Mega 2560
There is some issues with the xQueueReceive function…
This code is inspired by the code example of “xQueueSend”. REF: https://www.freertos.org/a00117.html
This is the code:
#include <Arduino_FreeRTOS.h>
#include <queue.h>
struct AMessage {
char ucMessageID;
char ucData[20];
} xMessage;
unsigned long ulVar = 10UL;
void vATask(void);
void setup() {
Serial.begin(115200);
vATask();
}
void loop() {
// Nothing
}
void vATask(void) { //void *pvParameters
QueueHandle_t xQueue1, xQueue2;
struct AMessage *pxMessage;
/* Create a queue capable of containing 10 unsigned long values. */
xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
/* Create a queue capable of containing 10 pointers to AMessage structures.
These should be passed by pointer as they contain a lot of data. */
xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
/* ... */
xMessage.ucMessageID = 1;
strcpy(xMessage.ucData, "Message1");
if(xQueue1 != 0) {
/* Send an unsigned long. Wait for 10 ticks for space to become
available if necessary. */
if(xQueueSend(xQueue1, (void*)&ulVar, (TickType_t)10) != pdPASS ) {
/* Failed to post the message, even after 10 ticks. */
}
}
if(xQueue2 != 0) {
/* Send a pointer to a struct AMessage object. Don't block if the
queue is already full. */
pxMessage = &xMessage;
xQueueSend(xQueue2, (void*)&pxMessage, (TickType_t)0);
Serial.println("SEND 1");
Serial.print("pxMessage->ucMessageID: ");
Serial.println(pxMessage->ucMessageID, DEC);
Serial.print("pxMessage->ucData: ");
Serial.println(pxMessage->ucData);
Serial.println();
xMessage.ucMessageID = 2;
strcpy(xMessage.ucData, "Message2");
pxMessage = &xMessage;
xQueueSend(xQueue2, (void*)&pxMessage, (TickType_t)0);
Serial.println("SEND 2");
Serial.print("pxMessage->ucMessageID: ");
Serial.println(pxMessage->ucMessageID, DEC);
Serial.print("pxMessage->ucData: ");
Serial.println(pxMessage->ucData);
Serial.println();
xQueueReceive(xQueue2, (void*)&pxMessage, (TickType_t)0);
Serial.println("RECEIVE 1");
Serial.print("pxMessage->ucMessageID: ");
Serial.println(pxMessage->ucMessageID, DEC);
Serial.print("pxMessage->ucData: ");
Serial.println(pxMessage->ucData);
Serial.println();
xQueueReceive(xQueue2, (void*)&pxMessage, (TickType_t)0);
Serial.println("RECEIVE 2");
Serial.print("pxMessage->ucMessageID: ");
Serial.println(pxMessage->ucMessageID, DEC);
Serial.print("pxMessage->ucData: ");
Serial.println(pxMessage->ucData);
Serial.println();
}
}
And this is the result on the arduino serial monitor:
SEND 1
pxMessage->ucMessageID: 1
pxMessage->ucData: Message1
SEND 2
pxMessage->ucMessageID: 2
pxMessage->ucData: Message2
RECEIVE 1
pxMessage->ucMessageID: 2
pxMessage->ucData: Message2
RECEIVE 2
pxMessage->ucMessageID: 2
pxMessage->ucData: Message2
This is just a simple test code that send two messages with a ID and a char array. i want to receive this two message but I read two times the last messag sended (ID=2, message=Message2).
I want this output:
SEND 1
pxMessage->ucMessageID: 1
pxMessage->ucData: Message1
SEND 2
pxMessage->ucMessageID: 2
pxMessage->ucData: Message2
RECEIVE 1
pxMessage->ucMessageID: 1
pxMessage->ucData: Message1
RECEIVE 2
pxMessage->ucMessageID: 2
pxMessage->ucData: Message2
Thank you for your help.