printf только печатает символы до размера буфера стандартного вывода

Я пытаюсь использовать функцию printf newlib для печати чего-либо на устройстве UART. Для этого я реализовал

int _write(int file, char *ptr, int len) {
  HAL_StatusTypeDef status;

  switch (file) {
  case STDOUT_FILENO: /*stdout*/
  case STDERR_FILENO: /* stderr */
    while ((status = HAL_UART_Transmit_IT(&UART_Uart2Handle, ptr, len)) == HAL_BUSY) {}

    if (status != HAL_ERROR) {
      errno = EBADF;
      return -1;
    }
    break;
  default:
    errno = EBADF;
    return -1;
  }
  return len;
}

Печать работает нормально, пока буфер stdout не будет заполнен, например, если я попытаюсь

setvbuf(stdout, NULL, _IOFBF, 3);
printf("Hello World!\n");
fflush(stdout); // Just to be sure ;)

Я получаю только "Хель" на устройстве. Подобное поведение наблюдается с _IONBF или же _IOLBF, Когда я устанавливаю точку останова на _write в отладчике меня вызывают только один раз для содержимого одного размера буфера.

Любые идеи или советы, почему _write чаще не звонят?

1 ответ

Проблема заключалась в том, что _write всегда вернулся -1 как HAL_UART_Transmit_IT возвращается HAL_OK когда все прошло нормально, так

if (status != HAL_ERROR) {
      errno = EBADF;
      return -1;
}

был всегда казнен. Чек должен быть изменен на status != HAL_OK,

Другие вопросы по тегам