I want to synchronize two tasks in a command/response communication server. One task sends data to a serial port and another task receives data on the serial port. Received data should either be returned to the sender task or do something else with it.
I unsuccessfully tried using volatile bool flags but have now found that won't work with C++ (See When to use volatile with multi threading?)
So trying to use semaphores to do it but can't quite figure out how.  Some (bad) psuedo-code using volatile bool is below.  How/where to modify for semaphore give/take?
Actual code/platform is C++ 11 running on ESP32 (ESP-IDF).  Resources are very limited so no C++ std:: libraries.
volatile bool responsePending = false;
volatile bool     cmdAccepted = false;
char sharedBuffer[100];
// SENDER //
void Task1()
{
    char localBuffer[100];
    
    while (1)
    {
        responsePending = true;
        cmdAccepted     = false;
        
        sendMessage();
        
        while (responsePending)
            sleep();
        
        strcpy(localBuffer, sharedBuffer);
        cmdAccepted = true; // signal Task2
    }
}
// RECEIVER //
void Task2()
{
    char localBuf[100];
    int fd = open();
    
    while (1)
    {
        if (select())
        {
            read(fd, localBuf);
            
            if (responsePending)
            {
                strcpy(sharedBuffer, localBuf);
                responsePending = false; // signal Task1
                
                while (!cmdAccepted)
                    sleep();
            }
            else
            {
                // Do something else with the received data
            }
        }
    }
}
 
    