printf只打印字符到stdout的缓冲区大小

时间:2016-06-05 14:27:43

标签: c newlib

我尝试使用newlib的printf函数在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 ;)

我只收到一个' Hel'在设备上。使用_IONBF_IOLBF观察到类似的行为。当我在调试器中的_write上设置断点时,我只调用一次缓冲区大小的内容。

为什么_write不会被更频繁地调用的任何想法或提示?

1 个答案:

答案 0 :(得分:1)

问题在于DialogFragment.getDialog().setCanceledOnTouchOutside(true);总是返回_write,因为-1在一切正常时返回HAL_UART_Transmit_IT,所以

HAL_OK
总是执行

。该检查需要更改为if (status != HAL_ERROR) { errno = EBADF; return -1; }