標題: 分享stm32串口打印函數(shù) [打印本頁]

作者: huanuozj    時間: 2017-11-14 15:52
標題: 分享stm32串口打印函數(shù)


分享一個stm32串口打印函數(shù),如果采用printf函數(shù)非常占內(nèi)存而且需要重定向,采用以下方法可以簡單打印調(diào)試信息等基本信息,可直接復制使用。

/******************************************************
                整形數(shù)據(jù)轉(zhuǎn)字符串函數(shù)
        char *itoa(int value, char *string, int radix)
                radix=10 標示是10進制        非十進制,轉(zhuǎn)換結(jié)果為0;  

            例:d=-379;
                執(zhí)行        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,...)
* 功    能:格式化串口輸出函數(shù)
* 入口參數(shù):USARTx:  指定串口
                        Data:   發(fā)送數(shù)組
                        ...:     不定參數(shù)
* 出口參數(shù):無
* 說    明:格式化串口輸出函數(shù)
                "\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)
* 調(diào)用方法:無
****************************************************************************/
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)
        {       
                                                          //判斷是否到達字符串結(jié)束符
                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打印,寫了一個,完善一下樓主的分享,哈哈
//十進制轉(zhuǎn)換成16進制,再轉(zhuǎn)化成字符用于打印%x
char *DecToHex(int value, char *string)
{
  char    *ptr = string;
  uint8_t num1,num2,num3,num4;//從高位到低位
  //先換算成16進制數(shù),然后再將每一位換成字符
   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函數(shù)在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.torrancerestoration.com/bbs/) Powered by Discuz! X3.1