您必须实现 __read 函数而不是 fgetc。删除 fgetc 的实现并使用以下代码。
将以下代码保存到文件中(例如 read.c)并将此文件添加到您的 IAR 项目中。
#include <LowLevelIOInterface.h>
#include "stm32l0xx_hal.h"
#pragma module_name = "?__read"
extern UART_HandleTypeDef huart2;
int MyLowLevelGetchar()
{
char ch;
while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) == RESET);
HAL_UART_Receive(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
return ch;
}
size_t __read(int handle, unsigned char * buffer, size_t size)
{
/* Remove the #if #endif pair to enable the implementation */
#if 1
int nChars = 0;
/* This template only reads from "standard in", for all other file
* handles it returns failure. */
if (handle != _LLIO_STDIN)
{
return _LLIO_ERROR;
}
for (/* Empty */; size > 0; --size)
{
int c = MyLowLevelGetchar();
if (c < 0)
break;
*buffer++ = c;
++nChars;
}
return nChars;
#else
/* Always return error code when implementation is disabled. */
return _LLIO_ERROR;
#endif
}
您可能需要根据您的目标 MCU 包含不同的“stm32xxx...”头文件。