我尝试使用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;
}
打印工作正常,直到stdout的缓冲区被填满,例如如果我试试
setvbuf(stdout, NULL, _IOFBF, 3);
printf("Hello World!\n");
fflush(stdout); // Just to be sure ;)
我只收到一个' Hel'在设备上。使用_IONBF
或_IOLBF
观察到类似的行为。当我在调试器中的_write
上设置断点时,我只调用一次缓冲区大小的内容。
为什么_write
不会被更频繁地调用的任何想法或提示?
答案 0 :(得分:1)
问题在于DialogFragment.getDialog().setCanceledOnTouchOutside(true);
总是返回_write
,因为-1
在一切正常时返回HAL_UART_Transmit_IT
,所以
HAL_OK
总是执行。该检查需要更改为if (status != HAL_ERROR) {
errno = EBADF;
return -1;
}
。