[英]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
总是返回-1
为HAL_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.