钻石会员
主题
帖子
积分18337
阅读权限50
注册时间2010-5-28
最后登录1970-1-1
在线时间 小时
|
小可在使用STM8的时候,喜欢利用自带的UART来做调试,这样的话就可以 下载+调试一条龙了,非常的方便.
我在 uart1.c 中写了许多的函数,像
UART1_SendByte()
UART1_SendStr()
UART1_SendNum()
UART1_SendInt()
虽然可以满足大部分的需要,但是在文字和数字结合时就得分别写多个函数,像:
UART1_SendStr("\r\nHello,");
UART1_SendNum( 2016 );
UART1_SendStr( "!" );
看起来不是很好.
于是想到了 printf.
电脑上printf可以打到控制台上,单片机肯定没那么聪明?
在 代码头部加上 #include "stdio.h"
这样就可以使用 printf函数了,网上查了资料,要改 putchar(),
找了一阵,没有找到 putchar ,估计是集成在某个地方,毕竟是标准化的.
随便找个位置 改了putchar,把输出定位到 uart1 上.
编译也成功了,到编译好的程序目录一看,乖乖,我这个程序什么没做就写了个hello word, 程序就占了5.XK.
这是难以容忍的~~
花了一上午的时间,自写了个函数,暂时能用,也没有纠错处理.
- int printf(u8 *fmt,...)
- {
- u8 *strp;
- s32 num;
- u8 i=0,tmp=0;
-
- va_list args;
- va_start ( args, fmt );
- do
- {
- tmp = *(fmt+i) ;
- if ( tmp != '%' )
- {
- UART1_SendByte( tmp );
- }
- else
- {
- i++;
- tmp = *(fmt+i) ;
- switch ( tmp )
- {
- case 'd':
- case 'D':
- num = va_arg( args, int );
- UART1_SendNum( num );
- // UART1_PrintNum();
- break;
- case 's':
- case 'S':
- strp = va_arg( args,u8 *);
- UART1_SendStr( strp );
- }
- }
- i++;
- } while( tmp != '\0' );
- return 0;
- }
复制代码 使用类似标准库的 printf ,只是少了许多功能,我是感觉用处不大,也增加程序的难度,暂时凑合用着吧.
编译下, BIN文件仅仅 1.XK,很好.
当然一上午肯定不止写这么几行啦,还重写了 打数字函数,用来自动判断数字是 8位,16位,32位,有符号,无符号..至于浮点数,我比较少用,以后再研究了吧.
|
|