简体   繁体   English

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

[英]printf only prints characters up to stdout's buffer size

I'm trying to use newlib's printf function to print something on a UART device. 我正在尝试使用newlib的printf函数在UART设备上打印。 Therefor I implemented 因此我实施了

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;
}

Printing works fine until the buffer of stdout is filled, eg if I try 打印工作正常,直到stdout的缓冲区被填满,例如,如果我尝试

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

I only receive a 'Hel' on the device. 我只在设备上收到“Hel”。 A similar behaviour is observed with _IONBF or _IOLBF . 使用_IONBF_IOLBF观察到类似的行为。 When I set a breakpoint on _write in the debugger I gets called only once for the content of one buffer size. 当我在调试器中的_write上设置断点时,我只调用一次缓冲区大小的内容。

Any ideas or hints why _write does not get called more often? 任何想法或提示为什么_write不会被更频繁地调用?

The problem was that _write always returned -1 as HAL_UART_Transmit_IT returns HAL_OK when everything went fine, so 问题是, _write总是返回-1HAL_UART_Transmit_IT返回HAL_OK时一切正常,所以

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

was always executed. 总是执行。 The check needs to be changed to status != HAL_OK . 检查需要更改为status != HAL_OK

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM