Накидайте идей - есть printf для UART Функция
void printf_UART(const char * format, ... )
{
va_list arg_ptr;
uint16_t n;
uint8_t buffer[128];
va_start(arg_ptr, format);
n = vsnprintf((char*) buffer, 128, format, arg_ptr );
va_end( arg_ptr );
while ( HAL_UART_Transmit_IT(&huart1, buffer, n ) == HAL_UART_STATE_BUSY_TX ){
osDelay(1);
}
}
Если вызвать во FreeRTOS только ее
for(;;)
{
printf_UART( "\r\nString sent %d ", 23 );
osDelay(1);
}
- все ок, вывод "String sent 23" на экране в цикле
Если же добавить считывание символа через IRQ - на терминале мусор после каждого нажатия клавиши.
for(;;)
{
xConsoleRead( (uint8_t*)&c );
printf_UART( "\r\nString sent %d ", 23 );
osDelay(1);
}
На терминале ------->
String▒J \J ▒
String▒J \J ▒
Не пойму в чем дело может быть?
В приемной части данные принимаются по IRQ и передаются через очередь в задачу FreeRTOS
//
// Читаем из очереди RX один байт *cReadChar - указатель на данные
// Возвращаем FreeRTOS status
//
BaseType_t xConsoleRead( uint8_t *cReadChar )
{
BaseType_t xRetVal = pdFALSE;
if (xQueueRxHandle == NULL || cReadChar == NULL)
{
return xRetVal;
}
/* Block until the there is input from the user */
return xQueueReceive(xQueueRxHandle, cReadChar, portMAX_DELAY);
}
//
// Обработчик прерывания USART - прием
//
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
BaseType_t pxHigherPriorityTaskWoken = pdFALSE;
if (xQueueRxHandle != NULL)
{
xQueueSendToBackFromISR(xQueueRxHandle, &cRxData, &pxHigherPriorityTaskWoken);
}
// разрешить прерывания
HAL_UART_Receive_IT( &huart1, (uint8_t*)&cRxData, 1 );
}