久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产欧美精品 | 免费观看黄a一级视频 | 毛片大全| 一级片av | 在线中文字幕亚洲 | 国产高清视频一区 | 国产精品毛片一区二区在线看 | 中文一区 | 成人精品视频 | 日韩免费网站 | 日韩高清国产一区在线 | 色综合久| 四虎影视1304t | 欧美一区二区三区小说 | 97久久久久久久久 | 欧美国产日韩一区二区三区 | 欧美日韩中文字幕在线 | 色婷婷综合网 | 国产日韩久久 | 成人午夜电影在线观看 | 精品国产鲁一鲁一区二区张丽 | 成人福利影院 | 黄色av免费 | 亚洲精品一区二区三区在线 | aaaaaaa片毛片免费观看 | 91一区二区三区在线观看 | 免费观看国产视频在线 | 日韩免费av网站 | www.v888av.com | 成人免费一区二区三区牛牛 | 播放一级黄色片 | 亚洲性在线 | 色婷婷久久 | 亚洲免费视频播放 | 美女久久 | 欧美xxxx色视频在线观看免费 | 一级特黄色毛片 | 国产一区二区在线91 | 一区免费观看 | 九九精品在线 | 成人国产精品一级毛片视频毛片 |