3

我正在尝试使用 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;
}

打印工作正常,直到标准输出的缓冲区被填满,例如,如果我尝试

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

我只在设备上收到“Hel”。使用_IONBF或观察到类似的行为_IOLBF。当我_write在调试器中设置断点时,我只被调用一次以获取一个缓冲区大小的内容。

任何想法或提示为什么_write不经常被调用?

4

1 回答 1

1

问题是,当一切顺利时,它_write总是-1作为HAL_UART_Transmit_IT回报返回,所以HAL_OK

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

总是被处决。检查需要更改为status != HAL_OK

于 2016-06-18T17:57:35.217 回答