1553|2

504

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

【ST NUCLEO-U575ZI-Q 测评 】标准输入输出的两种实现 [复制链接]

本帖最后由 qinyunti 于 2022-12-15 22:21 编辑

proj.zip (2.02 MB, 下载次数: 0)

前言

前面一篇我们实现了串口驱动,提供了串口读写的接口,为了方便调试,我们需要实现标准输入输出。我们可以使用MDK的MicroLIB实现,也可以直接使用源码,比如xprintf。

使用MicroLIB

工程配置中勾选Use MicroLIB

 

Help->uVision HELP搜索stdio可以找到标准输入输出的底层接口

 

我们实现接口fgetc和fputc即可。

添加target.c

 

#include <stdio.h>

#include "uart.h"

 

int fgetc(FILE *f)

{

/* Your implementation of fgetc(). */

int len=0;

uint8_t ch=0;

do

{

len = uart_read(&ch, 1);

}while(len == 0);

return ch;

}

int fputc(int c, FILE *stream)

{

/* Your implementation of fputc(). */

uint8_t ch=0;

if((uint8_t)ch == (uint8_t)'\n')

{

ch = '\r';

uart_write(&ch,1);

}

ch = (uint8_t)c;

uart_write(&ch,1);

return c;

}

 

main.c中测试

 

#include <stdio.h>

uart_init();

 

while(1)

{

int a;

int b;

printf("Hello World\r\n");

while(1)

{

printf("please input a and b:");

scanf("%d %d",&a,&b);

printf("%d+%d=%d\r\n",a,b,a+b);

}

}

 

 

使用xprintf

http://elm-chan.org/fsw/strf/xprintf.html

下载xprintf.c/h添加到工程中

main.c中实现收发接口

 

#include "xprintf.h"

int xprintf_out(int ch)

{

uint8_t c=ch;

uart_write(&c,1);

return ch;

}

 

int xprintf_in(void)

{

int len=0;

uint8_t ch=0;

do

{

len = uart_read(&ch, 1);

}while(len == 0);

return ch;

}

 

 

初始化设置接口

 

xdev_out(xprintf_out);

xdev_in(xprintf_in);

 

Xprintf.h中配置

 

#define XF_USE_OUTPUT 1 /* 1: Enable output functions */

#define XF_CRLF 1 /* 1: Convert \n ==> \r\n in the output char */

#define XF_USE_DUMP 1 /* 1: Enable put_dump function */

#define XF_USE_LLI 1 /* 1: Enable long long integer in size prefix ll */

#define XF_USE_FP 1 /* 1: Enable support for floating point in type e and f */

#define XF_DPC '.' /* Decimal separator for floating point */

#define XF_USE_INPUT 1 /* 1: Enable input functions */

#define XF_INPUT_ECHO 1 /* 1: Echo back input chars in xgets function */

 

 

测试

    xprintf("%d\n", 1234);             /* "1234" */

    xprintf("%6d,%3d%%\n", -200, 5);   /* "  -200,  5%" */

    xprintf("%-6u\n", 100);            /* "100   " */

    xprintf("%ld\n", 12345678);        /* "12345678" */

    xprintf("%llu\n", 0x100000000);    /* "4294967296"   <XF_USE_LLI> */

    xprintf("%lld\n", -1LL);           /* "-1"           <XF_USE_LLI> */

    xprintf("%04x\n", 0xA3);           /* "00a3" */

    xprintf("%08lX\n", 0x123ABC);      /* "00123ABC" */

    xprintf("%016b\n", 0x550F);        /* "0101010100001111" */

    xprintf("%*d\n", 6, 100);          /* "   100" */

    xprintf("%s\n", "abcdefg");        /* "abcdefg" */

    xprintf("%5s\n", "abc");           /* "  abc" */

    xprintf("%-5s\n", "abc");          /* "abc  " */

    xprintf("%.5s\n", "abcdefg");      /* "abcde" */

    xprintf("%-5.2s\n", "abcdefg");    /* "ab   " */

    xprintf("%c\n", 'a');              /* "a" */

    xprintf("%12f\n", 10.0);           /* "   10.000000" <XF_USE_FP> */

    xprintf("%.4E\n", 123.45678);      /* "1.2346E+02"   <XF_USE_FP> */

 

               

 

char buffer[64];

long a;

long b;

char* p;

while(1)

{

xprintf("please input a int:\n");

xgets(buffer,sizeof(buffer));

p = buffer;

xatoi(&p,&a);

xprintf("please input a int:\n");

xgets(buffer,sizeof(buffer));

p = buffer;

xatoi(&p,&b);

xprintf("%d+%d=%d\n",a,b,a+b);

}

 

 

总结

本文介绍了两种方式实现标注你输入输出,上面scanf输入好像还有点问题,后面再调试下。

推荐使用xprintf有源码,且代码小,比较灵活。

 

此帖出自stm32/stm8论坛

最新回复

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html   详情 回复 发表于 2023-1-12 09:43
点赞 关注
 

回复
举报

7671

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

谢谢分享,这东西有点意思!

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 

回复

1万

帖子

203

TA的资源

管理员

板凳
 

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html

此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表