gpt4 book ai didi

c - printf 仅打印标准输出缓冲区大小以内的字符

转载 作者:行者123 更新时间:2023-12-03 03:39:12 25 4
gpt4 key购买 nike

我正在尝试使用 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 没有被更频繁地调用吗?

最佳答案

问题在于,当一切顺利时,_write 总是返回 -1,因为 HAL_UART_Transmit_IT 返回 HAL_OK,所以

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

总是被执行。检查需要更改为 status != HAL_OK

关于c - printf 仅打印标准输出缓冲区大小以内的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com