printf打印的字符串顯示不同顏色:https://www.cnblogs.com/jikexianfeng/p/13807231.html
ubuntu@ubuntu:~/code/log$ tree . ├── main ├── main.c ├── user_lcd_log.c └── user_lcd_log.h 0 directories, 4 files
main.c
// ---------------------------------------------------------------------------------- # include <stdio.h> # include "user_lcd_log.h" // ---------------------------------------------------------------------------------- void main(void){ // 配置使能 set_Status_record_value(lcd_code_log_options_Hardware_data|lcd_code_log_options_Initialization_data|lcd_code_log_options_Filter_data|lcd_code_log_options_AT_Parsing|lcd_code_log_options_Type_conversion|lcd_code_log_options_Update_interface|lcd_code_log_options_Output_interface|lcd_code_log_options_Deconstruct); // 輸出 log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Hardware_data|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal)); log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Initialization_data|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal)); log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Filter_data|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal)); log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_AT_Parsing|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal)); log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Type_conversion|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal)); log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Deconstruct|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal)); log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Update_interface|lcd_code_log_options_tatus_Warning|lcd_code_log_options_terminal)); log_Debug_Message_output((par_type)"[email protected]",(lcd_code_log_options_Output_interface|lcd_code_log_options_tatus_conventional|lcd_code_log_options_terminal)); }
user_lcd_log.h
#ifndef __USER_LCD_LOG__H__ #define __USER_LCD_LOG__H__ // ---------------------------------------------------------------------------------- // 01是高亮度,不寫是低亮度。 // 40是背景色,40:黑,41:紅:42:綠,43:黃,44:青,45:藍,47:白。 // 32m是前景色:30:黑,31:紅,32:綠,33:黃,34:藍,35:紫,36:青,37:白。 // ---------------------------------------------------------------------------------- // printf # define system_printf "printf " // printf // head # define properties_head "\"\\033[" // 數據頭 // 添加分號 # define Control_code_add_semicolon ";" // 拼接 // 添加尾 # define Control_code_con_end "m" // 拼接 // 尾 # define Control_code_terminal_end "\n\"" // 尾部 # define Control_code_file_end "\n>>output.txt" // 尾部 // Control code # define Control_code_Close_all_properties 0 // 清空all屬性 # define Control_code_brightness_High 1 // 設置高亮度 # define Control_code_Italic 3 // 設置斜體 # define Control_code_Underscore 4 // 設置下劃線 # define Control_code_Flashing 5 // 設置閃爍 # define Control_code_Reverse 7 // 設置返現 # define Control_code_Blanking 8 // 設置消隱 # define Control_code_Strikethrough_text 9 // 設置文本刪除線 # define Control_code_Double_underscore 21 // 設置雙下劃線 // 字體顏色設置 # define Control_code_Font_color_black 30 // 設置字體顏色黑色 # define Control_code_Font_color_red 31 // 設置字體顏色紅色 # define Control_code_Font_color_green 32 // 設置字體顏色綠色 # define Control_code_Font_color_yellow 33 // 設置字體顏色黃色 # define Control_code_Font_color_blue 34 // 設置字體顏色藍色 # define Control_code_Font_color_purple 35 // 設置字體顏色紫色 # define Control_code_Font_color_Dark_green 36 // 設置字體顏色深綠 # define Control_code_Font_color_gray 37 // 設置字體顏色灰白 // 背景顏色設置 # define Control_code_background_color_black 40 // 設置背景顏色黑色 # define Control_code_background_color_red 41 // 設置背景顏色紅色 # define Control_code_background_color_green 42 // 設置背景顏色綠色 # define Control_code_background_color_yellow 43 // 設置背景顏色黃色 # define Control_code_background_color_blue 44 // 設置背景顏色藍色 # define Control_code_background_color_purple 45 // 設置背景顏色紫色 # define Control_code_background_color_Dark_green 46 // 設置背景顏色深綠 # define Control_code_background_color_gray 47 // 設置背景顏色灰白 // ---------------------------------------------------------------------------------- # define par_type long // ---------------------------------------------------------------------------------- // 流程 # define lcd_code_log_options_Hardware_data 0x0001 // lcd硬件數據 # define lcd_code_log_options_Initialization_data 0x0002 // 數據初始化 # define lcd_code_log_options_Filter_data 0x0004 // 數據過濾 # define lcd_code_log_options_AT_Parsing 0x0008 // 指令解析 # define lcd_code_log_options_Type_conversion 0x0010 // 數據類型轉換 # define lcd_code_log_options_Deconstruct 0x0020 // 解字模 # define lcd_code_log_options_Update_interface 0x0040 // 刷界面 Interface # define lcd_code_log_options_Output_interface 0x0080 // 輸出 Interface // 日報位置狀態 # define lcd_code_log_options_tatus_conventional 0X0100 // 日報狀態正常 # define lcd_code_log_options_tatus_Warning 0x0200 // 日報狀態異常 // 輸出位置狀態 # define lcd_code_log_options_terminal 0X1000 // 輸出到終端 # define lcd_code_log_options_file 0x2000 // 輸出到文件 // ---------------------------------------------------------------------------------- void set_Status_record_value(unsigned int Status_value); // 配置 void log_Debug_Message_output(par_type sbuf_addr,unsigned int mode); // ---------------------------------------------------------------------------------- #endif
user_lcd_log.c
// ---------------------------------------------------------------------------------- # include <stdio.h> # include <string.h> # include <time.h> # include <stdlib.h> # include "user_lcd_log.h" // ---------------------------------------------------------------------------------- struct Debug_Message_data{ unsigned long logo_out_Sign; unsigned int length; unsigned char logo_out_sbus[4096]; }; // ---------------------------------------------------------------------------------- // 清除調試數據 void Clean_Debug_Message_Module_data(par_type Debug_data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; Debug_Message->logo_out_Sign = 0; Debug_Message->length = 0; memset((void*)Debug_Message->logo_out_sbus,0,4096); } // printf void log_Debug_Message_Module_add_printf(par_type Debug_data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&(Debug_Message->logo_out_sbus[Debug_Message->length]),"%s",system_printf); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加數據頭 void log_Debug_Message_Module_add_head(par_type Debug_data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&(Debug_Message->logo_out_sbus[Debug_Message->length]),"%s",properties_head); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加參數 void log_Debug_Message_Module_add_data(par_type Debug_data_addr,char parameter){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%d",parameter); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加分號 void log_Debug_Message_Module_code_semicolon(par_type Debug_data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_add_semicolon); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加尾部 void log_Debug_Message_Module_code_end(par_type Debug_data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_con_end); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加時間 void log_Debug_Message_Module_add_Time(par_type Debug_data_addr,par_type label_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; char * label = (char *)label_addr; time_t t_time; struct tm *tm_time; // 時間轉換 t_time = time(NULL); tm_time = localtime(&t_time); sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%4d:%02d:%02d-%02d:%02d:%02d -- %s:",1900+tm_time->tm_year,tm_time->tm_mon,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec,label); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加字符串 void log_Debug_Message_Module_add_string(par_type Debug_data_addr,unsigned char * data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",data_addr); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加尾部 output終端 void log_Debug_Message_Module_terminal_end(par_type Debug_data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_terminal_end); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // 添加尾部 output 文件output.txt void log_Debug_Message_Module_file_end(par_type Debug_data_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; sprintf((void *)&Debug_Message->logo_out_sbus[Debug_Message->length],"%s",Control_code_file_end); Debug_Message->length = strlen(Debug_Message->logo_out_sbus); } // ---------------------------------------------------------------------------------- void printfss(par_type Debug_data_addr){ int count = 0; struct Debug_Message_data* Debug_Message = (struct Debug_Message_data *)Debug_data_addr; for(count = 0; count < 4096;count++){ printf("%c",Debug_Message->logo_out_sbus[count]); } } // ---------------------------------------------------------------------------------- // 正常日報 void log_Debug_Message_conventional_output(par_type Debug_Message_addr,par_type label_addr,par_type sbuf_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr; char * sbuf = (char *)sbuf_addr; unsigned int Output_Sign = (Debug_Message->logo_out_Sign)&0xf000; Clean_Debug_Message_Module_data(Debug_Message_addr); // 清理數據 log_Debug_Message_Module_add_printf(Debug_Message_addr); // 添加指令printf log_Debug_Message_Module_add_head(Debug_Message_addr); // 添加數據頭 log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_black); // 添加參數 log_Debug_Message_Module_code_end(Debug_Message_addr); // 添加尾部 log_Debug_Message_Module_add_Time(Debug_Message_addr,label_addr); // 添加時間 log_Debug_Message_Module_add_string(Debug_Message_addr,sbuf); // 添加字符串 switch(Output_Sign){ // 文件存儲位置 case lcd_code_log_options_terminal:{log_Debug_Message_Module_terminal_end(Debug_Message_addr);}break; case lcd_code_log_options_file:{log_Debug_Message_Module_file_end(Debug_Message_addr);}break; default:{;}break; } system((const char *)(Debug_Message->logo_out_sbus)); // 輸出日誌 } // 警告日報 void log_Debug_Message_Warning_output(par_type Debug_Message_addr,par_type label_addr,par_type sbuf_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr; char * sbuf = (char *)sbuf_addr; unsigned int Output_Sign = (Debug_Message->logo_out_Sign)&0xf000; Clean_Debug_Message_Module_data(Debug_Message_addr); // 清理數據 log_Debug_Message_Module_add_printf(Debug_Message_addr); // 添加指令printf log_Debug_Message_Module_add_head(Debug_Message_addr); // 添加數據頭 log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_brightness_High); // 添加參數 log_Debug_Message_Module_code_semicolon(Debug_Message_addr); // 添加分號 log_Debug_Message_Module_add_data(Debug_Message_addr,Control_code_Font_color_red); // 添加參數 log_Debug_Message_Module_code_end(Debug_Message_addr); // 添加尾部 log_Debug_Message_Module_add_Time(Debug_Message_addr,label_addr); // 添加時間 log_Debug_Message_Module_add_string(Debug_Message_addr,sbuf); // 添加字符串 switch(Output_Sign){ // 文件存儲位置 case lcd_code_log_options_terminal:{log_Debug_Message_Module_terminal_end(Debug_Message_addr);}break; case lcd_code_log_options_file:{log_Debug_Message_Module_file_end(Debug_Message_addr);}break; default:{;}break; } system((const char *)(Debug_Message->logo_out_sbus)); // 輸出日誌 } // ---------------------------------------------------------------------------------- // lcd硬件數據 # define log_conventional_lcd_hardware_data(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"硬件數據",sbuf_addr) // 正常日報 # define log_Warning_lcd_hardware_data(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"硬件數據",sbuf_addr) // 警告日報 // 數據初始化 # define log_conventional_Data_initialization(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"數據初始",sbuf_addr) // 正常日報 # define log_Warning_Data_initialization(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"數據初始",sbuf_addr) // 警告日報 // 數據過濾 # define log_conventional_lcd_Data_filtering(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"數據過濾",sbuf_addr) // 正常日報 # define log_Warning_lcd_Data_filtering(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"數據過濾",sbuf_addr) // 警告日報 // 指令解析 # define log_conventional_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"指令解析",sbuf_addr) // 正常日報 # define log_Warning_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"指令解析",sbuf_addr) // 警告日報 // 數據類型轉換 # define log_conventional_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"編碼轉換",sbuf_addr) // 正常日報 # define log_Warning_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"編碼轉換",sbuf_addr) // 警告日報 // 解字模 # define log_conventional_lcd_Deconstruct(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"解析字模",sbuf_addr) // 正常日報 # define log_Warning_lcd_Deconstruct(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"解析字模",sbuf_addr) // 警告日報 // 刷界面 Update Interface # define log_conventional_lcd_Update_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"刷新界面",sbuf_addr) // 正常日報 # define log_Warning_lcd_Update_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"刷新界面",sbuf_addr) // 警告日報 // 輸出界面 Interface # define log_conventional_lcd_output_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_conventional_output(Debug_Message_addr,(par_type)"輸出界面",sbuf_addr) // 正常日報 # define log_Warning_lcd_output_Interface(Debug_Message_addr,sbuf_addr) log_Debug_Message_Warning_output(Debug_Message_addr,(par_type)"輸出界面",sbuf_addr) // 警告日報 // ---------------------------------------------------------------------------------- // 配置使能 unsigned int Status_record_value; void set_Status_record_value(unsigned int Status_value){ Status_record_value = Status_value; } // 正常 void log_Debug_Message_Module_conventional_Process_Sign(par_type Debug_Message_addr,par_type sbuf_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr; unsigned int Process_Sign = (Debug_Message->logo_out_Sign)&0x00ff; // 流程 switch(Process_Sign&Status_record_value){ case lcd_code_log_options_Hardware_data:{log_conventional_lcd_hardware_data(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Initialization_data:{log_conventional_Data_initialization(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Filter_data:{log_conventional_lcd_Data_filtering(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_AT_Parsing:{log_conventional_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Type_conversion:{log_conventional_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Deconstruct:{log_conventional_lcd_Deconstruct(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Update_interface:{log_conventional_lcd_Update_Interface(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Output_interface:{log_conventional_lcd_output_Interface(Debug_Message_addr,sbuf_addr);}break; default :{;}break; } } // 警告日報 void log_Debug_Message_Module_Warning_Process_Sign(par_type Debug_Message_addr,par_type sbuf_addr){ struct Debug_Message_data* Debug_Message = (struct Debug_Message_data* )Debug_Message_addr; unsigned int Process_Sign = (Debug_Message->logo_out_Sign)&0x00ff; // 流程 switch(Process_Sign&Status_record_value){ case lcd_code_log_options_Hardware_data:{log_Warning_lcd_hardware_data(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Initialization_data:{log_Warning_Data_initialization(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Filter_data:{log_Warning_lcd_Data_filtering(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_AT_Parsing:{log_Warning_lcd_Instruction_analysis(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Type_conversion:{log_Warning_lcd_Data_type_conversion(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Deconstruct:{log_Warning_lcd_Deconstruct(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Update_interface:{log_Warning_lcd_Update_Interface(Debug_Message_addr,sbuf_addr);}break; case lcd_code_log_options_Output_interface:{log_Warning_lcd_output_Interface(Debug_Message_addr,sbuf_addr);}break; default :{;}break; } } // ---------------------------------------------------------------------------------- void log_Debug_Message_output(par_type sbuf_addr,unsigned int mode){ struct Debug_Message_data Debug_Message; unsigned int status_Sign = mode&0x0f00; Debug_Message.logo_out_Sign = mode; // 日誌 switch(status_Sign){ case lcd_code_log_options_tatus_conventional:{ log_Debug_Message_Module_conventional_Process_Sign((par_type)(&Debug_Message),sbuf_addr); // 正常 }break; case lcd_code_log_options_tatus_Warning:{ log_Debug_Message_Module_Warning_Process_Sign((par_type)(&Debug_Message),sbuf_addr); // 異常 }break; default :{log_Debug_Message_Warning_output((par_type)&Debug_Message,(par_type)"logo Warning",(par_type)"status_Sign Parameter error");}break; } } // ----------------------------------------------------------------------------------