How to send string through queue

ephobb wrote on Sunday, December 27, 2015:

Hi,
This is my first FreeRTOS based project.
I am trying to send string through one task to uart task. but i could see, only 1st letter is being sent.
here is my code

[code]
gbl_queue_handler = xQueueCreate(6,sizeof(uint8_t));
xTaskCreate((TaskFunction_t)Sd_uart,“Suart”,256,NULL,1,NULL);
xTaskCreate((TaskFunction_t)send_str1,“string1”,256,NULL,0,NULL);

void send_str1(void const * argument)
{
uint8_t dat[5]={‘S’,‘K’,‘N’,‘A’,‘B’};
for(;:wink:
{
xQueueSend(gbl_queue_handler,&dat[0],0);
vTaskDelay(1000);
}
}

void Sd_uart(void const * argument)
{
uint8_t data[6]={0};
uint8_t da;
for(;:wink:
{
HAL_UART_Transmit(&huart1,“UART Task”,9,1000);
if(xQueueReceive(gbl_queue_handler,data,100))
{
HAL_UART_Transmit(&huart1,&data[0],1,1000);
}
else
{
HAL_UART_Transmit(&huart1,“No Data”,7,1000);
}
}
}

[\code]

and part of the output where i m receving queued data is “…UART TaskSUART…”

edwards3 wrote on Sunday, December 27, 2015:

This line

xQueueCreate(6,sizeof(uint8_t));

creates a queue that holds 6 characters max. Each character is 8bits.
http://www.freertos.org/a00116.html

This line

xQueueSend(gbl_queue_handler,&dat[0],0);

sends ojne character to the queue. Only the ‘S’ is ever sent to the queue (the queue holds 8bit types).

If you want to send a string then the string needs to be null terminated in the normal C way, and then you need to create the queue to hold char pointers.

/* Create a string that holds pointers, each pointer is 4 bytes. */
xQueueCreate(6,sizeof(char*));

const char *myString="SKNAB";

/* Queue a pointer. */
xQueueSend(gbl_queue_handler,&myString,0);

ephobb wrote on Sunday, December 27, 2015:

Thanks it works.
can you please give me some links for queue tutorial. I read basic queue creation, send and receive.
but i want to know how to protect it with semaphore.
because more than task may be send data to uart.

rtel wrote on Sunday, December 27, 2015:

Queues (or any other FreeRTOS object) do not need to be protected by the
application - that is all taken care of by the RTOS itself. Any number
of tasks and interrupts can write to or read from the same queue. Note
that when accessing a queue from an interrupt only the API functions
appended with “FromISR” can be used.

Regards.