精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言打印程序行號、日期方便調試程序

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2022-09-09 11:43 ? 次閱讀

【摘要】 平時開發C語言程序時,經常需要調試代碼,C語言有一些宏,可以打印出當前的行號、文件名稱、日期、時間,對程序的調試起到很大的幫助,可以快速定位問題。特別是開發單片機程序時,使用這些宏打印這些信息或者在LCD上顯示程序的編譯日期、時間,可以知道這個單片機上的固件是什么時候編譯。幫助判斷版本。

一、前言

平時開發C語言程序時,經常需要調試代碼,C語言有一些宏,可以打印出當前的行號、文件名稱、日期、時間,對程序的調試起到很大的幫助,可以快速定位問題。特別是開發單片機程序時,使用這些宏打印這些信息或者在LCD上顯示程序的編譯日期、時間,可以知道這個單片機上的固件是什么時候編譯。幫助判斷版本。

ANSIC標準定義了可供C語言使用的預定義宏:
__LINE__ : 在源代碼中插入當前源代碼行號
__FILE__ : 在源代碼中插入當前源代碼文件名
__DATE__ : 在源代碼中插入當前編譯日期
__TIME__ : 在源代碼中插入當前編譯時間

其中標識符__LINE__和__FILE__一般用來調試程序,打印信息,方便定位錯誤。

標識符__DATE__和__TIME__一般可以用來表示固件的版本,方便了解運行的程序是什么時候的版本。

標識符__LINE__是一個整數,其他的文件名稱、日期、時間都是字符串。

二、打印示例

printf("編譯日期與時間: %s,%s\n", __DATE__,__TIME__);
printf("當前所在行號:%d\r\n", __LINE__);
printf("當前源文件名稱:%s\r\n", __FILE__);
printf("當前固件編譯日期:%s\r\n", __DATE__);
printf("當前固件編譯時間:%s\r\n", __TIME__);
image-20220507175252472

三、C語言封裝快捷Debug

#define DEBUG

#ifdef DEBUG
static int DebugPrintf(const char *format, ...)
{
	va_list arg_data;
	int     count;
	va_start(arg_data, format);                  /*  獲取可變參數列表  */
	fflush(stdout);                              /*  強制刷新輸出緩沖區  */
	count = vfprintf(stderr, format, arg_data);  /*  將信息輸出到標準出錯流設備  */
	va_end(arg_data);                            /*  可變參數列表結束  */
	return count;
}
#else
static inline int DebugPrintf(const char *format, ...)
{

}
#endif

通過DEBUG這個宏來開啟是否開啟調試信息打印功能,如果程序穩定后,不需要打印調試信息,就可以將DEBUG的定義取消掉即可。

完整代碼:

#include 
#include 
#include 
#include 
#include 
#include   
#include  

using namespace std;

//#define DEBUG

#ifdef DEBUG
static int DebugPrintf(const char *format, ...)
{
	va_list arg_data;
	int     count;
	va_start(arg_data, format);                  /*  獲取可變參數列表  */
	fflush(stdout);                              /*  強制刷新輸出緩沖區  */
	count = vfprintf(stderr, format, arg_data);  /*  將信息輸出到標準出錯流設備  */
	va_end(arg_data);                            /*  可變參數列表結束  */
	return count;
}
#else
static inline int DebugPrintf(const char *format, ...)
{
	return 0;
}
#endif
int main()
{
	DebugPrintf("編譯日期與時間: %s,%s\n", __DATE__,__TIME__);
	DebugPrintf("當前所在行號:%d\r\n", __LINE__);
	DebugPrintf("當前源文件名稱:%s\r\n", __FILE__);
	DebugPrintf("當前固件編譯日期:%s\r\n", __DATE__);
	DebugPrintf("當前固件編譯時間:%s\r\n", __TIME__);
	return 0;
}

四、STM32單片機上封裝printf函數

/*
函數功能: 字符串發送
*/
void USARTx_StringSend(USART_TypeDef *USARTx,u8 *str)
{
   while(*str!='\0')
   {
       USARTx->DR=*str++;
       while(!(USARTx->SR&1<<7)){}
   }
}

//printf函數底層函數接口
int fputc(int c, FILE* stream)
{
    USART1->DR=c;
    while(!(USART1->SR&1<<7)){}
    return c;
}

/*
函數功能: 格式化打印函數
*/
char USART1_PRINTF_BUFF[1024];
void USART1_Printf(char *fmt,...)
{
   va_list ap;
   /*1. 初始化形參列表*/
   va_start(ap,fmt);
   /*2. 提取可變形參數據*/
    vsprintf(USART1_PRINTF_BUFF,fmt,ap);
   /*3. 結束,釋放空間*/
    va_end(ap);
   /*4. 輸出數據到串口1*/
   USARTx_StringSend(USART1,(u8*)USART1_PRINTF_BUFF);
   
   //USART1_Printf("%d%s",123,454656); 
   //int data=va_arg(ap,int);
}

USART1_Printf的用法與printf是一樣的,通過這個函數就可以實現數據打印到任意地方,包括改成存儲到SD卡上。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6032

    文章

    44518

    瀏覽量

    633063
  • C語言
    +關注

    關注

    180

    文章

    7598

    瀏覽量

    136207
  • 程序
    +關注

    關注

    116

    文章

    3777

    瀏覽量

    80853
收藏 人收藏

    評論

    相關推薦

    串口調試程序

    串口調試程序
    發表于 03-15 12:27 ?30次下載
    串口<b class='flag-5'>調試程序</b>

    基于Labview的通用串口調試程序

    基于Labview的通用串口調試程序 使用方法: 1.在baud rate里設置通訊的波特率 2.在milliseconds to wait的毫秒數要大于等于20,這樣可以保證收發數據的成 功率. 3.
    發表于 05-05 11:19 ?248次下載

    如何為程序代碼加上行號

    若需要將程序代碼放進詞交報告或做文件時,或許我們會想將程序代碼加上行號方便講解,如同博客園顯示程序代碼那樣,我們該如何做呢?
    發表于 05-10 08:17 ?2183次閱讀

    微機原理調試程序

    微機原理調試程序,32位操作系統才能正常使用。
    發表于 11-09 14:47 ?2次下載

    903雙模程序-調試程序

    903雙模程序-調試程序 三相無刷BLDC應用程序
    發表于 11-10 10:45 ?13次下載

    SSCOM32_串口調試程序

    串口調試程序 自己測試已經通過可以使用
    發表于 12-24 10:52 ?59次下載

    串口調試程序

    串口調試程序,單片機學習好資料,歡迎下載學習。
    發表于 03-22 17:34 ?22次下載

    小車電機pwm調試程序

    小車電機pwm調試程序,原理圖配套,原理圖是按照驅動芯片l298來實現的。
    發表于 04-05 15:36 ?9次下載

    智能小車調試程序

    智能小車51單片機調試程序,帶PWM調制和使能端控制。希望大家一起相互學習
    發表于 07-25 10:58 ?14次下載

    JTAG 鏈調試程序工具的作用及應用

    JTAG 鏈調試程序工具
    的頭像 發表于 06-20 01:00 ?4004次閱讀
    JTAG 鏈<b class='flag-5'>調試程序</b>工具的作用及應用

    串口調試程序火災報警器調試工具C語言程序免費下載

    本文檔的主要內容詳細介紹的是串口調試程序火災報警器調試工具C語言程序免費下載。
    發表于 10-22 17:39 ?36次下載
    串口<b class='flag-5'>調試</b>小<b class='flag-5'>程序</b>火災報警器<b class='flag-5'>調試</b>工具<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b>免費下載

    很實用的串口調試程序免費下載

    本文檔的主要內容詳細介紹的是很實用的串口調試程序免費下載。
    發表于 01-17 08:00 ?5次下載
    很實用的串口<b class='flag-5'>調試程序</b>免費下載

    Linux用日志打印的方式調試程序

    一般來說,初學編程者所寫的第一個程序,就是使用printf打印“Hello world”。其實printf的功效遠不只這些,在程序調試方面,printf也有非常大的用處。
    發表于 05-13 11:31 ?3533次閱讀

    基于STM32的藍牙HC05調試程序 通過手機控制STM32單片機程序

    基于STM32的藍牙HC05調試程序 通過手機控制STM32單片機程序
    發表于 11-24 12:36 ?121次下載
    基于STM32的藍牙HC05<b class='flag-5'>調試程序</b> 通過手機控制STM32單片機<b class='flag-5'>程序</b>

    STC串口驅動調試程序

    STC的串口驅動調試程序。
    發表于 07-08 14:23 ?3次下載