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
,