打印

串口打印函数输出问题

[复制链接]
201|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
车水马龙|  楼主 | 2019-11-14 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
* 函数名:itoa
* 描述  :将整形数据转换成字符串
* 输入  :-radix =10 表示10进制,其他结果为0
*         -value 要转换的整形数
*         -buf 转换后的字符串
*         -radix = 10
* 输出  :无
* 返回  :无
* 调用  :被USART_printf()调用
*/
char *itoa(int value, char *string, int radix)
{
    int     i, d;
    int     flag = 0;
    char    *ptr = string;

    /* This implementation only works for decimal numbers. */
    if (radix != 10)
    {
        *ptr = 0;
        return string;
    }

    if (!value)
    {
        *ptr++ = 0x30;
        *ptr = 0;
        return string;
    }

    /* if this is a negative value insert the minus sign. */
    if (value < 0)
    {
        *ptr++ = '-';

        /* Make the value positive. */
        value *= -1;
    }

    for (i = 10000; i > 0; i /= 10)
    {
        d = value / i;

        if (d || flag)
        {
            *ptr++ = (char)(d + 0x30);
            value -= (d * i);
            flag = 1;
        }
    }

    /* Null terminate the string. */
    *ptr = 0;

    return string;

} /* NCL_Itoa */

/*
* 函数名:USART_printf
* 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
* 输入  :-USARTx 串口通道
*                     -Data   要发送到串口的内容的指针
*                           -...    其他参数
* 输出  :无
* 返回  :无
* 调用  :外部调用
*         典型应用USART_printf( USART1, "\r\n this is a demo \r\n" );
*                             USART_printf( USART2, "\r\n %d \r\n", i );
*                             USART_printf( USART3, "\r\n %s \r\n", j );
*/
void USART_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
        const char *s;
  int d;   
  char buf[16];

  va_list ap;
  va_start(ap, Data);

        while ( *Data != 0)     // 判断是否到达字符串结束符
        {                                                         
                if ( *Data == 0x5c )  //'\'
                {                                                                          
                        switch ( *++Data )
                        {
                                case 'r':                                                                  //回车符
                                        USART_SendData(USARTx, 0x0d);
                                        Data ++;
                                        break;

                                case 'n':                                                                  //换行符
                                        USART_SendData(USARTx, 0x0a);        
                                        Data ++;
                                        break;

                                default:
                                        Data ++;
                                    break;
                        }                        
                }
                else if ( *Data == '%')
                {                                                                          //
                        switch ( *++Data )
                        {                                
                                case 's':                                                                                  //字符串
                                        s = va_arg(ap, const char *);
          for ( ; *s; s++)
                                        {
                                                USART_SendData(USARTx,*s);
                                                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
          }
                                        Data++;
          break;

        case 'd':                                                                                //十进制
          d = va_arg(ap, int);
          itoa(d, buf, 10);
          for (s = buf; *s; s++)
                                        {
                                                USART_SendData(USARTx,*s);
                                                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
          }
                                        Data++;
          break;
                                 default:
                                                Data++;
                                    break;
                        }                 
                } /* end of else if */
                else USART_SendData(USARTx, *Data++);
                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
}
这是网上找的串口打印函数,使用时 USART_printf(USART1," \r\n 当前时间为: %d年 %d月 %d日 %d时:%d:%0.2d \r\n",nowtime.year+2000,
                                   nowtime.month,nowtime.day,nowtime.hour,nowtime.minute,7);想像火哥那样把7打印成07,可是实际打印出来的不对是02d请教下这是为什么?

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

474

主题

476

帖子

0

粉丝