Hi,kolban wrote:To create a queue, you would use xQueueCreate ... see http://www.freertos.org/a00116.html
The size parameter would be large enough to hold a pointer to a character string ... for example:
When you have a string to place on the queue:Code: Select all
sizeof(char *)
you could then allocate enough storage for it and copy it in:Code: Select all
char *myData = "helloWorld";
You could then push the item onto the queue using xQueueSendToBack() ... see http://www.freertos.org/xQueueSendToBack.htmlCode: Select all
char *myItem = malloc(strlen(myData)+1); strcpy(myItem, myData);
for example,
When you wish to receive an item ...Code: Select all
xQueueSendToBack(myQueue, &myItem, portMAX_DELAY);
See: http://www.freertos.org/a00118.htmlCode: Select all
char *myReceivedItem; xQueueReceive(myQueue, &myReceivedItem, portMAX_DELAY); // Do something with received string and then delete it ... free(myReceivedItem);
I want to send and recieve multiple strings to/from queue.
but as I send strings in queue one by one in one task and receive in other task, on recieve task it is only receiving first string that is sent on queue. I am getting what is the problem. please help me out for this problem.
below is my code.
Code: Select all
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "string.h"
#define BUF 1024
xQueueHandle xQueue;
void consumer_task(void *pvParameter)
{
char* rxmesage;
while(1){
if( xQueue != 0 ) {
if( (xQueuePeek( xQueue, &( rxmesage ), ( portTickType ) 10 )) == pdTRUE)
{
printf("value received on queue: %s \n",rxmesage);
vTaskDelay(1500/portTICK_PERIOD_MS); //wait for 500 ms
}
}
}
}
void producer_task(void *pvParameter){
char *mydata="scanData={\"priority\":\"Normal\",\"device\":\"Reader1\",\"event\":\"STRAY\",\"timeStamp\":\"10/8/2018 11:16:10 PM\",\"scanItems\":[{\"thing\":\"%d%d\",\"deviceName\":\"%s\",\"mfid\":\"%X%X\",\"aid\":\"%u\",\"rid\":\"%u\",\"rssi\":%s,\"txPower\":%d,\"battery\":%u,\"scanTime\":\"25/8/2018 11:16:10 PM\",\"scanCount\":1,\"additionalData\":{\"mov\":\"%u\",\"temp\":%d,\"humidity\":%u,\"pressure\":\"%u\",\"location\":null}}],\"message\":\"Test\"}";
char *repl_data="";
int count=0;
while(1){
asprintf(&repl_data,"%d %s",count,mydata);
printf("value sent on queue: %s \n",repl_data);
xQueueSend(xQueue,(void *)&repl_data,(TickType_t )0); // add the counter value to the queue
vTaskDelay(500/portTICK_PERIOD_MS); //wait for a second
count++;
}
}
void app_main()
{
uint8_t* dataSerial = (uint8_t*) malloc(BUF);
xQueue = xQueueCreate( 1, sizeof(dataSerial));
if(xQueue != NULL){
printf("Queue is created\n");
vTaskDelay(1000/portTICK_PERIOD_MS); //wait for a second
xTaskCreate(&producer_task,"producer_task",1024*4,NULL,5,NULL);
printf("producer task started\n");
xTaskCreate(&consumer_task,"consumer_task",1024*4,NULL,5,NULL);
printf("consumer task started\n");
}else{
printf("Queue creation failed");
}
}