找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3400|回复: 2
打印 上一主题 下一主题
收起左侧

分享stm32串口打印函数

[复制链接]
跳转到指定楼层
楼主
ID:249341 发表于 2017-11-14 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


分享一个stm32串口打印函数,如果采用printf函数非常占内存而且需要重定向,采用以下方法可以简单打印调试信息等基本信息,可直接复制使用。

/******************************************************
                整形数据转字符串函数
        char *itoa(int value, char *string, int radix)
                radix=10 标示是10进制        非十进制,转换结果为0;  

            例:d=-379;
                执行        itoa(d, buf, 10); 后
               
                buf="-379"                                                                                     
**********************************************************/
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 */


/****************************************************************************
* 名    称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)
* 功    能:格式化串口输出函数
* 入口参数:USARTx:  指定串口
                        Data:   发送数组
                        ...:     不定参数
* 出口参数:无
* 说    明:格式化串口输出函数
                "\r"        回车符           USART_OUT(USART1, "abcdefg\r")   
                        "\n"        换行符           USART_OUT(USART1, "abcdefg\r\n")
                        "%s"        字符串           USART_OUT(USART1, "字符串是:%s","abcdefg")
                        "%d"        十进制           USART_OUT(USART1, "a=%d",10)
* 调用方法:无
****************************************************************************/
void USART_OUT(USART_TypeDef* USARTx, char *Data,...)
{
        const char *s;
    int d;
    char buf[16];
//        uint8_t *Data = pData;
    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;
                        }                 
                }
                else USART_SendData(USARTx, *Data++);
                while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
        }
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:95072 发表于 2020-3-18 11:05 | 只看该作者
很赞,很好的解决了printf占空间问题
回复

使用道具 举报

板凳
ID:95072 发表于 2020-3-18 15:27 | 只看该作者
我正好需要用到%x打印,写了一个,完善一下楼主的分享,哈哈
//十进制转换成16进制,再转化成字符用于打印%x
char *DecToHex(int value, char *string)
{
  char    *ptr = string;
  uint8_t num1,num2,num3,num4;//从高位到低位
  //先换算成16进制数,然后再将每一位换成字符
   if(value<256)
   {
     num1=value/16;
     num2=value%16;
     if(num1<10)
       *ptr++=num1+48;//0-9
     else
       *ptr++=num1+87;//a-f
     if(num2<10)
       *ptr++=num2+48;
     else
       *ptr++=num2+87;
   }
   else if(value<65536)
   {
     num1=value/4096;//最高位
     num2=value/256%16;//次高位
     num3=value%256/16;//次低位
     num4=value%16;//最低位
     
     if(num1<10)
       *ptr++=num1+48;
     else
       *ptr++=num1+87
     
     if(num2<10)
       *ptr++=num2+48;
     else
       *ptr++=num2+87;
     
     if(num3<10)
       *ptr++=num3+48;
     else
       *ptr++=num3+87
     
     if(num4<10)
       *ptr++=num4+48;
     else
       *ptr++=num4+87;

   }
   /* Null terminate the string. */
    *ptr = 0;
   return string;
}
USART_OUT函数在case'd'情况后面添加
case 'x':
                                  d = va_arg(ap, int);//每次取一个整形
                                  DecToHex(d, buf);
                                  for (s = buf; *s; s++)
                                  {
                                    USART_SendData(USARTx,*s);
                                     while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
                                  }
                                  Data++;
                                  break;
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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