我想在STM32F401RE_NUCLEO中使用带有IAR编译器的scanf()函数。
这是我重载的fgetc函数。
int fgetc(FILE *f) {
char ch;
while (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) == RESET);
HAL_UART_Receive(&UartHandle, (uint8_t*)&ch, 1, 0xFFFF);
return ch;
}
我在主要功能中使用scanf,如下所示。
int n;
printf("[DBG] Input: ");
scanf("%d", &n);
printf("[DBG] Output: %d\n", n);
如果我从终端输入“123”,则打印“23”。
%d,%u,%f相同。
但是,只有%c才能正常工作。
我该如何解决这个问题?
答案 0 :(得分:0)
可能你和mikrocontroller.net论坛中的那个人有同样的问题。
他需要实现函数 __ write 和 __ read 而不是 fgetc 和 fputc 。
原型:
size_t __write(int Handle, const unsigned char * buf, size_t count);
size_t __read(int Handle, unsigned char * buf, size_t count);
对您而言可能也很有趣:How to override and redirect library modules。
答案 1 :(得分:0)
您必须实现__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 ...”头文件。