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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3391|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

分享stm32串口打印函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:249341 發(fā)表于 2017-11-14 15:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


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

/******************************************************
                整形數(shù)據(jù)轉(zhuǎn)字符串函數(shù)
        char *itoa(int value, char *string, int radix)
                radix=10 標(biāo)示是10進(jìn)制        非十進(jìn)制,轉(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"        十進(jìn)制           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)
        {       
                                                          //判斷是否到達(dá)字符串結(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':                                                                                  //十進(jìn)制
                        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);
        }
}


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:95072 發(fā)表于 2020-3-18 11:05 | 只看該作者
很贊,很好的解決了printf占空間問題
回復(fù)

使用道具 舉報

板凳
ID:95072 發(fā)表于 2020-3-18 15:27 | 只看該作者
我正好需要用到%x打印,寫了一個,完善一下樓主的分享,哈哈
//十進(jìn)制轉(zhuǎn)換成16進(jìn)制,再轉(zhuǎn)化成字符用于打印%x
char *DecToHex(int value, char *string)
{
  char    *ptr = string;
  uint8_t num1,num2,num3,num4;//從高位到低位
  //先換算成16進(jìn)制數(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;
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频导航 | 在线免费黄色小视频 | 97av视频| 国产伦精品 | 日韩高清中文字幕 | 欧美一级观看 | 亚洲播放一区 | 色网在线看 | 午夜免费福利电影 | 午夜av一区二区 | 一级h片| 秋霞电影一区二区三区 | 黄色大片免费观看 | 国产在线一区二区三区 | 日本精品网站 | 毛片在线看片 | 中文字幕第三页 | 伊人精品一区二区三区 | 在线视频一区二区三区 | 日韩精品1区2区3区 成人黄页在线观看 | 久久久久久国产精品 | 五月激情六月婷婷 | 国产精品我不卡 | 国产精品毛片在线 | 日本免费小视频 | 国内精品视频在线 | 国产精品一二区 | 欧美日韩一区二区电影 | 亚洲激情网站 | 国产黄色一级片 | 日韩不卡一二区 | 91视视频在线观看入口直接观看 | 欧美日韩国产一区二区三区 | 成人av一区| 久久91精品| 人人干视频在线 | 在线观看国产视频 | 中文在线一区 | 亚洲精品久久久久中文字幕欢迎你 | 成人在线精品视频 | 欧美 日韩 中文 |