首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个reretget.c是如何工作的?

这个reretget.c是如何工作的?
EN

Stack Overflow用户
提问于 2014-03-30 03:55:49
回答 1查看 1.4K关注 0票数 0

有人能给我解释一下这个reretget.c是如何工作的吗?我正在尝试向微控制器的uart发送整数,我已经成功地使用fgets获取字符(16位),并使用Uart Interupt服务例程中的atoi函数返回整数,但我正在尝试使用scanf获取整数,我想我需要更改下面列出的重定目标文件?

代码语言:javascript
复制
#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);

    }
}
EN

回答 1

Stack Overflow用户

发布于 2014-03-30 04:15:47

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

如下所示:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22736108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档