Free RTOS Task Communication

Hello

I am working on the Free RTOS code that I am trying to send the data on the server using Free RTOS but I am not able to send data on the server I am using some dummy data and GPS for location +STM32F411ceu6a+EC200U GNSS. But my RTOS task is not working can some one plz help me find the problem in my code.
CODE:-

// Globals
QueueHandle_t xQueue;
SemaphoreHandle_t xBinarySemaphore;

typedef struct {
    float Latitude;
    float Longitude;
    float objectTemp;
    float ambientTemp;
    float xG;
    float yG;
    float zG;
    float avg;
} GPSData_t;


/* Definitions for ec200u6 */
osThreadId_t ec200u6Handle;
const osThreadAttr_t ec200u6_attributes = {
  .name = "ec200u6",
  .stack_size = 128* 4,
  .priority = (osPriority_t) osPriorityRealtime,
};
/* Definitions for L89 */
osThreadId_t L89Handle;
const osThreadAttr_t L89_attributes = {
  .name = "L89",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityRealtime,
};
/* Definitions for myQueue01 */
osMessageQueueId_t myQueue01Handle;
const osMessageQueueAttr_t myQueue01_attributes = {
  .name = "myQueue01"
};
/* Definitions for myMutex01 */
osMutexId_t myMutex01Handle;
const osMutexAttr_t myMutex01_attributes = {
  .name = "myMutex01"
};
/* Definitions for myBinarySem01 */
osSemaphoreId_t myBinarySem01Handle;
const osSemaphoreAttr_t myBinarySem01_attributes = {
  .name = "myBinarySem01"
};


void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_ADC1_Init(void);
static void MX_I2C1_Init(void);
static void MX_SPI1_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_USART6_UART_Init(void);
void Startec200u6(void *argument);
void StartL89(void *argument);


   // Create the queue
     xQueue = xQueueCreate(10, sizeof(GPSData_t)); // Adjust the size as needed

     // Create the binary semaphore
     xBinarySemaphore = xSemaphoreCreateBinary();

     if (xQueue != NULL && xBinarySemaphore != NULL)
     {
         // Create the tasks
         xTaskCreate(Startec200u6, "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
         xTaskCreate(StartL89, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

         // Start the scheduler
         vTaskStartScheduler();
     }

  /* USER CODE END 2 */

  /* Init scheduler */
  osKernelInitialize();
  /* Create the mutex(es) */
  /* creation of myMutex01 */
  myMutex01Handle = osMutexNew(&myMutex01_attributes);

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* Create the semaphores(s) */
  /* creation of myBinarySem01 */
  myBinarySem01Handle = osSemaphoreNew(1, 1, &myBinarySem01_attributes);

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* Create the queue(s) */
  /* creation of myQueue01 */
  myQueue01Handle = osMessageQueueNew (16, sizeof(uint16_t), &myQueue01_attributes);

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* creation of ec200u6 */
  ec200u6Handle = osThreadNew(Startec200u6, NULL, &ec200u6_attributes);

  /* creation of L89 */
  L89Handle = osThreadNew(StartL89, NULL, &L89_attributes);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */
  vTaskStartScheduler();
  /* Start scheduler */
//  osKernelStart();


void Startec200u6(void *pvParameters)
{
    /* USER CODE BEGIN 5 */
    /* Infinite loop */
    GPSData_t receivedData;
    int retryCount;
    const int maxRetries = 2;

    for (;;) // Infinite loop for the task
    {
        if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE)
        {
            if (xQueueReceive(xQueue, &receivedData, portMAX_DELAY) == pdPASS)
            {
                // Retry sending data up to maxRetries times
                retryCount = 0;
                while (!sendHTTP(receivedData.Latitude, receivedData.Longitude,
                                 receivedData.objectTemp, receivedData.ambientTemp,
                                 receivedData.xG, receivedData.yG, receivedData.zG,
                                 receivedData.avg))
                {
                    vTaskDelay(pdMS_TO_TICKS(2000)); // Delay for 2000 ms
                    if (retryCount < maxRetries)
                    {
                        retryCount++;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
    }
    /* USER CODE END 5 */
}

void StartL89(void *pvParameters)
{
    /* USER CODE BEGIN StartL89 */
    GPSData_t gpsData;

    for (;;) // Infinite loop for the task
    {
        // Receive data from UART
        HAL_UART_Receive(&huart2, (uint8_t *)Rxdata, 700, 5000);

        // Get location data
        get_location(&gpsData.Latitude, &gpsData.Longitude, 0);

        // Populate other sensor data
        gpsData.objectTemp = 25.0; // Predefined value for object temperature
              gpsData.ambientTemp = 24.0; // Predefined value for ambient temperature
              gpsData.xG = 0.1; // Predefined value for X-axis acceleration
              gpsData.yG = 0.2; // Predefined value for Y-axis acceleration
              gpsData.zG = 0.3; // Predefined value for Z-axis acceleration
              gpsData.avg = (gpsData.xG + gpsData.yG + gpsData.zG) / 3.0; // Calculate average
        // Toggle the pin to indicate data reception
        L89_TogglePin(2, 3);

        // Attempt to send the data to the queue
        if (xQueueSend(xQueue, &gpsData, portMAX_DELAY) != pdPASS)
        {
            // Handle queue send error
        }
        else
        {
            // Data was successfully queued, give the semaphore
            xSemaphoreGive(xBinarySemaphore);
        }
    }
    /* USER CODE END StartL89 */
}

Is it working when stepping through the code with a debugger ?
Seems you start your tasks twice (xTaskCreate and osThreadNew ?).
That makes not much sense.
Using a queue and a semaphore for signaling data is useless. A queue provides all functionality needed.
Stack size seems a bit small, too.
You should enable FreeRTOS - stacks and stack overflow checking and defined configASSERT for development.

This code needs a lot of cleanup as suggested by @hs2. Here is a quick attempt at that -

    /* Create kernel objects and start scheduler. */
    xQueue = xQueueCreate(10, sizeof(GPSData_t)); // Adjust the size as needed
    configASSERT( xQueue != NULL );

    xTaskCreationResult = xTaskCreate(Startec200u6, "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    configASSERT( xTaskCreationResult == pdPASS );
    xTaskCreationResult = xTaskCreate(StartL89, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    configASSERT( xTaskCreationResult == pdPASS );

    // Start the scheduler
    vTaskStartScheduler();


void Startec200u6(void *pvParameters)
{
    /* USER CODE BEGIN 5 */
    /* Infinite loop */
    GPSData_t receivedData;
    int retryCount;
    const int maxRetries = 2;

    for (;;) // Infinite loop for the task
    {
        if (xQueueReceive(xQueue, &receivedData, portMAX_DELAY) == pdPASS)
        {
            // Retry sending data up to maxRetries times
            retryCount = 0;
            while (!sendHTTP(receivedData.Latitude, receivedData.Longitude,
                                receivedData.objectTemp, receivedData.ambientTemp,
                                receivedData.xG, receivedData.yG, receivedData.zG,
                                receivedData.avg))
            {
                vTaskDelay(pdMS_TO_TICKS(2000)); // Delay for 2000 ms
                if (retryCount < maxRetries)
                {
                    retryCount++;
                }
                else
                {
                    break;
                }
            }
        }
    }
    /* USER CODE END 5 */
}

void StartL89(void *pvParameters)
{
    /* USER CODE BEGIN StartL89 */
    GPSData_t gpsData;

    for (;;) // Infinite loop for the task
    {
        // Receive data from UART
        HAL_UART_Receive(&huart2, (uint8_t *)Rxdata, 700, 5000);

        // Get location data
        get_location(&gpsData.Latitude, &gpsData.Longitude, 0);

        // Populate other sensor data
        gpsData.objectTemp = 25.0; // Predefined value for object temperature
              gpsData.ambientTemp = 24.0; // Predefined value for ambient temperature
              gpsData.xG = 0.1; // Predefined value for X-axis acceleration
              gpsData.yG = 0.2; // Predefined value for Y-axis acceleration
              gpsData.zG = 0.3; // Predefined value for Z-axis acceleration
              gpsData.avg = (gpsData.xG + gpsData.yG + gpsData.zG) / 3.0; // Calculate average
        // Toggle the pin to indicate data reception
        L89_TogglePin(2, 3);

        // Attempt to send the data to the queue
        xQueueSend(xQueue, &gpsData, portMAX_DELAY);
    }
    /* USER CODE END StartL89 */
}