我正在尝试使用 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
不经常被调用?