初级会员
- 积分
- 101
- 金钱
- 101
- 注册时间
- 2013-8-8
- 在线时间
- 2 小时
|
楼主 |
发表于 2013-8-21 16:05:03
|
显示全部楼层
自问自答,你给的帖子中有我的身影。 IAR printf
1: 一定一定要在主程序中加入 STDIO.H
2:putchar()要重新定义
3:串口波特率 115200 8 NO 1形式
4: 编译器library 选型中 选择FULL
5:如果实验以上还是不行,还有一个方法就是自己来写printf函数!
以下是网上摘抄的的printf函数,经过测试,完全可以用!
#include "stm8s.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>//itoa()......库中没有
#include <string.h> //memset()
#include <math.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
//#include <memory.h>
#define MAXBUF 15
#define DEFAULT_PRECI 3 //符点型默认精度
/*
由于不同的编译器 putcha 和 getchar 形参和返回值略有不同。
因此此处采用宏定义的方式区别。
_RAISONANCE_ 和 _COSMIC_ 这2个宏是由编译器自动添加的预编译宏
*/
#ifdef _RAISONANCE_
#define UTCHAR_PROTOTYPE int putchar (char c)
#define GETCHAR_PROTOTYPE int getchar (void)
#elif defined (_COSMIC_)
#define UTCHAR_PROTOTYPE char putchar (char c)
#define GETCHAR_PROTOTYPE char getchar (void)
#else /* _IAR_ */
#define UTCHAR_PROTOTYPE int putchar (int c)
#define GETCHAR_PROTOTYPE int getchar (void)
#endif /* _RAISONANCE_ */
/*
*********************************************************************************************************
* 函 数 名: putchar
* 功能说明: 重定义 putchar 函数, 这样可以使用printf函数从串口1打印输出
* 形 参: 等待发送的字符
* 返 回 值: 返回已发送的字符
*********************************************************************************************************
*/
PUTCHAR_PROTOTYPE
{
/* 发送一个字符 c 到UART1 */
UART2_SendData8(c);
/* 等待发送完毕 */
while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET);
//while (UART2_GetFlagStatus(UART2_FLAG_TC) == RESET);
return (c);
}
/*
*********************************************************************************************************
* 函 数 名: getchar
* 功能说明: 重定义C库中的 getchar 函数,这样可以使用scanff函数从串口1输入数据
* 形 参: 无
* 返 回 值: 返回已读到的字符
*********************************************************************************************************
*/
GETCHAR_PROTOTYPE
{
#ifdef _COSMIC_
char c = 0;
#else
int c = 0;
#endif
/* 等待新数据到达 */
while (UART2_GetFlagStatus(UART2_FLAG_RXNE) == RESET);
/* 读取数据寄存器 */
c = UART2_ReceiveData8();
return (c);
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
// 应用到printf函数之后还是无法进行格式输出//
int add(const int n,...)
{
va_list arg;//定义va_list类型变量arg
va_start(arg,n);//arg初始化,n是第一个可见参数名字;使arg指向第一个可选参数
int sum=0;
int tmp =0;
for(int i=0;i<n;i++)
{
tmp=va_arg(arg,int);//返回参数列表中的当前参数并使arg指向参数列表中的下一个参数
sum+=tmp;
}
va_end(arg);//把arg指针清为NULL
return sum;
}
const double eps = 1e-12;
char s[30];
void reverse(char *s)
{
int i , j;
int len = strlen(s);//字符串长度计数器,计算从头到位的长度
for( i = 0 , j = len - 1 ; i >< j ; i++ , j--)
s^=s[j]^=s^=s[j]; //字符串头尾相调
}
//实现实数到字符串的转换
void ftoa(uint32_t n, int8_t *s, uint16_t digits)
{
memset(s , 0 , sizeof(s));//将S指向的一块内存中的每个字节替换为0的ASCALL码值,内存大小由sizeof(s)决定
//为新开辟的内存清零
int i = 0 , p;
int8_t sign = TRUE;
if( n < 0 )
{
sign = FALSE;
n = -n;
}
long t = ( long)n;
n = n - t;
if( t == 0)
{
s[i++] = '0';
}
else
{
while( t != 0 )
{
p = t % 10;
t /= 10;
s[i++] = p + '0';
}
if(!sign) s[i++] = '-';
reverse(s);
}
if( fabs( n - 0.0 ) > eps ) //求浮点数n的绝对值
{
s[i++] = '.';
int cur_d = 0;
while( cur_d < digits)
{
cur_d++;
n *= 10.0;
p = (long )n;
n = n - p;
s[i++] = p + '0';
}
}
s = '\0';
}
char *myitoa(int num,char *str,int radix)
{
/* 索引表 */
char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned unum; /* 中间变量 */
int i=0,j,k;
/* 确定unum的值 */
if(radix==10&&num<0) /* 十进制负数 */
{
unum=(unsigned)-num;
str[i++]='-';
}
else unum=(unsigned)num; /* 其他情况 */
/* 逆序 */
do
{
str[i++]=index[unum%(unsigned)radix];
unum/=radix;
}while(unum);
str='\0';
/* 转换 */
if(str[0]=='-') k=1; /* 十进制负数 */
else k=0;
/* 将原来的“/2”改为“/2.0”,保证当num在16~255之间,radix等于16时,也能得到正确结果 */
char temp;
for(j=k;j<=(i-k-1)/2.0;j++)
{
temp=str[j];
str[j]=str[i-j-1];
str[i-j-1]=temp;
}
return str;
}
int myPrintf(const char *format, ...)
{
va_list ap;
va_start(ap,format);
//STRING
//char ch;
const char *str;
//const char *str1;
//OCT
int value ;
char buf[MAXBUF];
//HEX
int offset;
unsigned char ucI,ucLen;
unsigned long ulValue;
//unsigned char ucBuf[MAXBUF];
//unsigned long *ulpValue;
//FLOAT
double fdata;
//BINARY
while(*format)
{
if('%'!=*format)
{
putchar(*format++);
continue;
}
switch(*++format)
{
case 's':
str = NULL;
str=va_arg(ap, const char *);
for(;*str!='\0';str++)
{
putchar(*str);
}
++format;//越过当前参数,移到下一个参数
break;
case 'd':
value=va_arg(ap,const int);
memset(buf,0,sizeof(buf));
myitoa(value, buf, 10);
for (str=buf ;*str!='\0'; str++)
{
putchar(*str);
}
++format;
break;
case 'x':
offset = 0;
ucLen = 0 ;
ulValue=va_arg(ap,const int);
memset(buf,0,sizeof(buf));
if( !ulValue )
{
buf[ucLen] = ulValue ;
str = buf ;
putchar((*str+48));
++format;
break;
}
for( ucI=0;ucI<MAXBUF;ucI++)
{
if( pow(16,ucI)>ulValue )
{
ucLen = ucI;
break;
}
}
for( ucI=0;ucI<ucLen;ucI++)
{
buf[ucI] = ulValue/pow(16,ucLen-ucI-1) ;
ulValue = ulValue%(unsigned long)pow(16,ucLen-ucI-1);
}
//puts("0x");
for (str=buf ;*str!='\0'; str++)
{
if( (*str>=0) && (*str<=9) )
{
putchar((*str+48));
}
else
{
putchar((*str+87));
}
}
++format;
break;
case 'X':
offset = 0;
ucLen = 0 ;
ulValue=va_arg(ap,const int);
memset(buf,0,sizeof(buf));
if( !ulValue )
{
buf[ucLen] = ulValue ;
str = buf ;
putchar((*str+48));
++format;
break;
}
for( ucI=0;ucI<MAXBUF;ucI++)
{
if( pow(16,ucI)>ulValue )
{
ucLen = ucI;
break;
}
}
for( ucI=0;ucI<ucLen;ucI++)
{
buf[ucI] = ulValue/pow(16,ucLen-ucI-1) ;
ulValue = ulValue%(unsigned long)pow(16,ucLen-ucI-1);
}
//puts("0X");
for (str=buf ;*str!='\0'; str++)
{
if( (*str>=0) && (*str<=9) )
{
putchar((*str+48));
}
else
{
putchar((*str+55));
}
}
++format;
break;
case 'f':
fdata = va_arg(ap, double);
memset(buf,0,sizeof(buf));
ftoa(fdata, buf, DEFAULT_PRECI);
for (str=buf ;*str!='\0'; str++)
{
putchar(*str);
}
++format;
break;
case '.':
if( isdigit(*++format) )
{
if( 'f'==(*++format) )
{
--format;
fdata = va_arg(ap, double);
memset(buf,0,sizeof(buf));
int preci =*format-'0';
ftoa(fdata, buf, preci);
for (str=buf ;*str!='\0'; str++)
{
putchar(*str);
}
++format;
++format;
}
}
else
{
--format;
if( 'f'==(*++format) )
{
fdata = va_arg(ap, double);
memset(buf,0,sizeof(buf));
int preci =1;
ftoa(fdata, buf, preci);
for (str=buf ;*str!='\0'; str++)
{
putchar(*str);
}
++format;
}
}
break;
case 'b':
value=va_arg(ap,const int);
memset(buf,0,sizeof(buf));
myitoa(value, buf, 2);
for (str=buf ;*str!='\0'; str++)
{
putchar(*str);
}
++format;
break;
default:
break;
}
}
va_end(ap);
return 0;
}
/* ftoa: convert double n to string s with digits*/ |
|