scanf()缺少第一个字母

时间:2017-05-25 01:44:50

标签: c scanf fgetc stm32f4

我想在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才能正常工作。

我该如何解决这个问题?

2 个答案:

答案 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 ...”头文件。