有人可以向我解释一下retarget.c的工作原理吗?
我正在尝试与微控制器的uart之间发送整数,我已经成功使用fgets获取字符(16位)并在Uart Interupt服务例程中使用atoi函数返回了整数,但是我试图获取使用scanf的整数,我想我需要更改下面概述的重定向文件?

#include <stdio.h>
#include <time.h>
#include <rt_misc.h>

#define AHB_LED_BASE                0x50000000
#define AHB_UART_BASE               0x51000000

#pragma import(__use_no_semihosting)

struct __FILE {
    unsigned char * ptr;
    };

FILE __stdout =     {(unsigned char *)  AHB_UART_BASE};
FILE __stdin =      {(unsigned char *)  AHB_UART_BASE};

int fputc(int ch, FILE *f)
{
  return(uart_out(ch));

}

int fgetc(FILE *f)
{
    return(uart_in());
}

int ferror(FILE *f)
{
  return 0;
}

int uart_out(int ch)
{
    int* UARTPtr;
    UARTPtr = (int*)AHB_UART_BASE;
    *UARTPtr = (int)ch;
    return(ch);
}

int uart_in()
{
    int ch;
    int* UARTPtr;
    UARTPtr = (int*)AHB_UART_BASE;
    ch = *UARTPtr;
    uart_out(ch);
    return((int)ch);
}

void _ttywrch(int ch)
{
  fputc(ch,&__stdout);
}

void _sys_exit(void) {


    while(1);

}


//------------------------------------------------------------------------------
// Cortex-M0
//------------------------------------------------------------------------------

#include <stdio.h>
#include <time.h>
#include <rt_misc.h>
#include <stdlib.h>

#define AHB_LED_BASE                0x50000000
#define AHB_UART_BASE               0x51000000


void UART_ISR(void)
{
            int sample;

            printf("the value entered is %d\n", sample);
}

//////////////////////////////////////////////////////////////////
// Main Function
//////////////////////////////////////////////////////////////////

int main() {

    {

        int sample;
        scanf ("%d",&sample);

    }
}

最佳答案

scanf函数将需要ungetc,因为它必须在缓冲区中向前扫描以查看字段何时结束。例如,当寻找一个数字时,它需要在数字后拉一个字符以查看数字的结尾。当它看到非数字字符时,需要将其放回流中,以便对getc的下一次调用将得到它。

像这样:

struct __FILE
{
    unsigned char * ptr;
    int unchar; /* place to keep the character put back in the stream */
};

FILE __stdout =     {(unsigned char *)  AHB_UART_BASE, -1};
FILE __stdin =      {(unsigned char *)  AHB_UART_BASE, -1};

int fgetc(FILE *f)
{
    int c;

    if (f->unchar == -1)
    {
        c = uart_in();  /* just read a character */
    }
    else
    {
        c = f->unchar;  /* reuse the character put back by ungetc */
        f->unchar = -1; /* mark it as used */
    }
    return c;
}

int fungetc(int c, FILE *f)
{
    unsigned char uc = c; /* POSIX says that it is converted first to unsigned char */
    f->unchar = (int )uc; /* put back the character */
    return (int )uc;
}

10-04 12:35
查看更多