OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15841|回复: 3

IAR for STM8 的 编译器 对Printf 的格式输出不支持吗?

[复制链接]

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-8
在线时间
2 小时
发表于 2013-8-21 12:08:19 | 显示全部楼层 |阅读模式
现在我们想利用printf 格式输出调试信息。 结果发现在底层中对 putchar() getchar()这两个函数重定义之后,也不能很好的利用printf格式输出。(字符串输出是可以的)

printf("* QQ    : 1295744630 \r\n"); //这样是可以正确打印

printf("%s", “nothing”);//这样就不能正确打印。

现在我可以正确打印了 ,需要重新编写printf函数。 


看到论坛里其他大虾是能够使用printf的,大家遇到过printf不能格式输出的问题吗?




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

107

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2013-5-5
在线时间
0 小时
发表于 2013-8-21 14:30:11 | 显示全部楼层
http://www.openedv.com/posts/list/17302.htm
游走在生活里,你我都是涉世未深的旅人,前方有我们为之心怡的归宿,身后又是一片葱郁的往昔,让生活的零碎随风而来,又似过往的随风云烟而散,唯有这厮,方能守得云开,待到春花烂漫!
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
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*/
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2014-3-18
在线时间
5 小时
发表于 2014-11-2 15:49:47 | 显示全部楼层
回复【3楼】zxc2769:
---------------------------------
没在MCU的C代码上用过printf函数,可以试试!
电机设计与控制
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表