Yes, I can give you an example. Here are 3 tasks that ae sending different data sets meant for different destinations over the same serial port.
void fLIDAR_Is_OK ( void *pvParameters )
{
String sSerial = "<$>";
TickType_t xLastWakeTime;
const TickType_t xFrequency = pdMS_TO_TICKS( 1000 );
xLastWakeTime = xTaskGetTickCount();
for ( ;; )
{
vTaskDelayUntil( &xLastWakeTime, xFrequency );
bool LIDAR_OK = true;
if ( xSemaphoreTake( sema_SendSerialToBrain, xZeroTicksToWait ) == pdTRUE )
{
if (xHANDLE_LIDAR_ServoAspectChange == NULL )
{
Serial.println ( " xHANDLE_LIDAR_ServoAspectChange " );
LIDAR_OK = false;
}
if ( xHANDLE_DoLIDAR == NULL )
{
Serial.println ( " xHANDLE_DoLIDAR " );
LIDAR_OK = false;
}
if ( xHANDLE_SendLIDAR_InfoSerialToBrain == NULL )
{
Serial.println ( " xHANDLE_SendLIDAR_InfoSerialToBrain " );
LIDAR_OK = false;
}
if ( xHANDLE_SendSerialToBrain == NULL )
{
Serial.println ( " xHANDLE_SendSerialToBrain " );
LIDAR_OK = false;
}
if ( xHANDLE_TweakServoX == NULL )
{
Serial.println ( " xHANDLE_TweakServoX " );
LIDAR_OK = false;
}
if ( xHANDLE_TweakServoY == NULL )
{
Serial.println ( " xHANDLE_TweakServoY " );
LIDAR_OK = false;
}
if ( xHANDLE_GetIMU == NULL )
{
Serial.println ( " xHANDLE_GetIMU " );
LIDAR_OK = false;
}
if ( LIDAR_OK )
{
SerialBrain.println ( sSerial );
}
}
xSemaphoreGive ( sema_SendSerialToBrain );
xLastWakeTime = xTaskGetTickCount();
}
vTaskDelete( NULL );
}
//******************************************
void fSendLIDAR_InfoSerialToBrain( void *pvParameters )
{
struct stu_LIDAR_INFO pxLIDAR_INFO;
for ( ;; )
{
xEventGroupWaitBits (eg, evtGetIMU, pdTRUE, pdTRUE, portMAX_DELAY);
xSemaphoreTake( sema_LIDAR_FOR_ALARM, xSemaphoreTicksToWait );
xQueueReceive ( xQ_LIDAR_FOR_ALARM, &pxLIDAR_INFO, QueueReceiveDelayTime );
xSemaphoreGive( sema_LIDAR_FOR_ALARM );
int CellCount = 1 ;
String sSerial = "";
sSerial.reserve ( 300 );
sSerial.concat( "<#," );
sSerial.concat( String(ScanPoints) + "," );
sSerial.concat( String(pxLIDAR_INFO.ServoSweepUp) + "," );
for ( CellCount; CellCount <= ScanPoints; CellCount++ )
{
sSerial.concat( String(pxLIDAR_INFO.Range[CellCount]) + "," );
}
sSerial.concat( ">" );
vTaskDelay( 10 );
SerialBrain.println ( sSerial );
}
vTaskDelete( NULL );
} // void fSendLIDAAR_InfoSerialToBrain( void *pvParameters )
////
void fSendSerialToBrain( void *pvParameters )
{
struct stu_LIDAR_INFO pxLIDAR_INFO;
xSemaphoreGive ( sema_SendSerialToBrain );
for (;;)
{
xEventGroupWaitBits (eg, evtSendSerialToBrain, pdTRUE, pdTRUE, portMAX_DELAY);
if ( xSemaphoreTake( sema_SendSerialToBrain, xZeroTicksToWait ) == pdTRUE )
{
String sSerial = "";
sSerial.reserve ( 300 );
int CellCount = 1;
xSemaphoreTake( sema_LIDAR_INFO, xSemaphoreTicksToWait );
xQueueReceive ( xQ_LIDAR_INFO, &pxLIDAR_INFO, QueueReceiveDelayTime );
xSemaphoreGive( sema_LIDAR_INFO );
sSerial.concat( "<!," );
sSerial.concat( String(ScanPoints) + "," );
for ( CellCount; CellCount <= ScanPoints; CellCount++ )
{
sSerial.concat( String(pxLIDAR_INFO.Range[CellCount]) + "," );
}
sSerial.concat( ">" );
SerialBrain.println ( sSerial );
}
}
vTaskDelete( NULL );
} // void fSendSerialToBrain( void *pvParameters )