轉自:http://blog.163.com/huangwei820410@126/blog/static/24070492200962881431558/
Uart_Printf
()為常用的串口列印函數,其常用於滿足特定條件時通過串口列印資訊。很多開發人員喜歡在中斷服務程式中使用它,所以,僅僅包含一句Uart_Printf
()的中斷服務程式,可以被認為是一個普遍而簡單的應用。下面給出針對只包含一句Uart_Printf
()的中斷服務程式進行測試的結果。
Uart_Printf()函數分析
ARM與PC機通訊,常通過Uart_Printf()這個函數在上位機裡輸出資訊。下面來詳細分析這個函數功能。
原形:
//-----------------------------------------------------------------
void Uart_Printf(char *fmt,...) //...表示可變參數(多個可變參數組成一
個列表,後面有專門的指標指向他),不限定個數和類型,
{
va_list ap;//初始化指向可變參數列表的指標
char string[256];
va_start(ap,fmt);//將第一個可變參數的地址付給ap,即ap指向可變參數列
表的開始
vsprintf(string,fmt,ap);//將參數fmt、ap指向的可變參數一起轉換成格式
化字串,放string數組中,其作用同
sprintf(),只是參數類型不同
Uart_SendString(string); //把格式化字串從開發板串口送出去
va_end(ap); //ap付值為0,沒什麼實際用處,主要是為程式健壯性
}//-----------------------------
va_list 在這個宏定義在stdarg.h中,所以用到可變參數的程式應該包含這個檔案。
(1)格式化字串
printf(“%s, %-19s: %6.2”,lastname,firstname,prize);
列印結果:Bechr,Teddy ;2000.00
我們說“ Bechr,Teddy ;2000.00
”就是一個格式化字串,printf的作用就是把(“%s, %-19s:
6.2”,lastname,firstname,prize)翻譯成電腦認識的字串,而對於“%s, %-19s:
6.2”,lastname,firstname,prize電腦根部不認識,故需要printf翻譯。
(2)vsprintf
函數名: vsprintf
功 能: 送格式化輸出串到指定數組中
用 法: int vsprintf(char *string, char *format, va_list param);
vsprintf與sprintf功能是一樣的,即把格式化字串輸出到指定數組
中,sprintf(char *string, char *farmat
[,argument,...])函數的參數從第二個參數開始與printf是一樣的,只是sprintf是輸出到指定數組中,printf是輸出到螢幕
(一個標準輸出檔案),因而sprintf多了char *string這參數。
Uart_Printf()這個函數在三星提供的庫函數44blib.c中,其中的va_start,vsprintf,va_end等都是在stdarg.h中宏定義的,這個檔案在linux核心中,這裡不多加分析了,先掌握怎麼用它。
總之,這個函數可以簡單的理解為將你C語言裡的輸出習慣轉化為硬體底層能認識的字串。調用這個函數是可以按照標準C裡面向終端輸出的方法,輸出自己的要輸出內容
加幾個標頭檔:
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>