C語言中有個很好用的函數(shù):printf()。printf()是格式化輸出函數(shù),可以按照規(guī)定格式輸出消息。相信每個工程師開始學習的C語言第一課都會遇到printf(“Hello World! n”);這條語句。
在嵌入式開發(fā)中,我們調試時時常需要輸出一些調試信息,那這時候printf語句就非常有用了。但是遺憾的是,C標準庫函數(shù)中默認的輸出設備是顯示器,所以當我們進行嵌入式開發(fā)的時候,是不能夠直接使用printf的。如果我們想要方便的在嵌入式開發(fā)中進行printf操作,那么就必須重定向printf語句。
我們可以查一下C標準庫函數(shù),printf語句其實是使用了一個函數(shù)int fputc(int ch, FILE *f); 此函數(shù)原本是將字符ch打印到文件指針所指向的文件流中去的,現(xiàn)在我們不需要打印到文件流,而是打印到串口1。我們只需要重新編寫這個函數(shù)。當系統(tǒng)檢測到用戶編寫的fputc函數(shù)時,就會調用用戶所編寫的函數(shù),而不是使用原本的fputc了。
函數(shù)如下:
注意這里需要使用到頭文件stdio.h,否則FILE類型未定義。以上是基于MDK環(huán)境下,使用MicroLib的情況下重定向printf。還有一種方法是使用半主機模式。半主機模式是ARM的一種機制,不使用microLib庫,實現(xiàn)ARM應用程序代碼的輸入/輸出請求傳至運行著調試器的主機,這樣就可以使用主機的顯示器和鍵盤,而不需要再ARM系統(tǒng)上搭配顯示器和鍵盤。當然,這種做法并不常見,有興趣的同學可以自己研究一下。
如果這篇文章到這里就結束了,那么就太常規(guī)了。下面我還要講一個非常規(guī)的操作以實現(xiàn)串口輸出字符串。
Printf重定向的方法是非常常規(guī)的,但是我就是不想用,而且我還想調用一個函數(shù)就能輸出一串任意的字符串,怎么辦?我就想出了另一種寫法,先貼代碼:
乍一看,這段代碼非常簡單啊,就是使用了一個指針,然后串口輸出的時候指針指向的地址不停+1?。〉俏覀冊倏匆幌抡{用:
我們這里直接將一個字符串作為參數(shù)進行了傳遞,編譯器報了一個警告:warning: ‘char[25]’ to parameter of type ‘uint8_t *’ (aka ‘unsigned char *’) converts between pointers to integer types with different sign。
很明顯,數(shù)據(jù)類型沖突了。但是在程序中我們將兩種方式都進行了輸出,最后發(fā)現(xiàn)調試結果是正確的。如下圖所示。
這是為什么呢?其實也很簡單,我們這里進行了一個非法操作。當我們調用該函數(shù)時,將字符串數(shù)組作為實參,在函數(shù)定義中強制轉換成了一個指針。而這個指針,指向的是字符串數(shù)組的第一個地址,所以該函數(shù)運行時就能夠正確輸出我們所編寫的字符串了。
-
顯示器
+關注
關注
21文章
4981瀏覽量
140074 -
STM32
+關注
關注
2270文章
10904瀏覽量
356367 -
ARM處理器
+關注
關注
6文章
360瀏覽量
41773 -
C語言
+關注
關注
180文章
7605瀏覽量
137003 -
調試器
+關注
關注
1文章
305瀏覽量
23759
發(fā)布評論請先 登錄
相關推薦
評論