标题: 分享stm32串口打印函数 [打印本页]

作者: huanuozj    时间: 2017-11-14 15:52
标题: 分享stm32串口打印函数


分享一个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);
        }
}



作者: 阿斯顿马丁    时间: 2020-3-18 11:05
很赞,很好的解决了printf占空间问题
作者: 阿斯顿马丁    时间: 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;




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1