ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
3 декабря
1430809
Mty1 (28.04.2024 19:16, просмотров: 600)
Накидайте идей - есть 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 ); }