C語言中有個很好用的函數(shù):printf()。printf()是格式化輸出函數(shù),可以按照規(guī)定格式輸出消息。相信每個工程師開始學(xué)習(xí)的C語言第一課都會遇到printf(“Hello World! n”);這條語句。
在嵌入式開發(fā)中,我們調(diào)試時時常需要輸出一些調(diào)試信息,那這時候printf語句就非常有用了。但是遺憾的是,C標(biāo)準(zhǔn)庫函數(shù)中默認(rèn)的輸出設(shè)備是顯示器,所以當(dāng)我們進(jìn)行嵌入式開發(fā)的時候,是不能夠直接使用printf的。如果我們想要方便的在嵌入式開發(fā)中進(jìn)行printf操作,那么就必須重定向printf語句。
我們可以查一下C標(biāo)準(zhǔn)庫函數(shù),printf語句其實(shí)是使用了一個函數(shù)int fputc(int ch, FILE *f); 此函數(shù)原本是將字符ch打印到文件指針?biāo)赶虻奈募髦腥サ模F(xiàn)在我們不需要打印到文件流,而是打印到串口1。我們只需要重新編寫這個函數(shù)。當(dāng)系統(tǒng)檢測到用戶編寫的fputc函數(shù)時,就會調(diào)用用戶所編寫的函數(shù),而不是使用原本的fputc了。
函數(shù)如下:
注意這里需要使用到頭文件stdio.h,否則FILE類型未定義。以上是基于MDK環(huán)境下,使用MicroLib的情況下重定向printf。還有一種方法是使用半主機(jī)模式。半主機(jī)模式是ARM的一種機(jī)制,不使用microLib庫,實(shí)現(xiàn)ARM應(yīng)用程序代碼的輸入/輸出請求傳至運(yùn)行著調(diào)試器的主機(jī),這樣就可以使用主機(jī)的顯示器和鍵盤,而不需要再ARM系統(tǒng)上搭配顯示器和鍵盤。當(dāng)然,這種做法并不常見,有興趣的同學(xué)可以自己研究一下。
如果這篇文章到這里就結(jié)束了,那么就太常規(guī)了。下面我還要講一個非常規(guī)的操作以實(shí)現(xiàn)串口輸出字符串。
Printf重定向的方法是非常常規(guī)的,但是我就是不想用,而且我還想調(diào)用一個函數(shù)就能輸出一串任意的字符串,怎么辦?我就想出了另一種寫法,先貼代碼:
乍一看,這段代碼非常簡單啊,就是使用了一個指針,然后串口輸出的時候指針指向的地址不停+1啊!但是我們再看一下調(diào)用:
我們這里直接將一個字符串作為參數(shù)進(jìn)行了傳遞,編譯器報了一個警告:warning: ‘char[25]’ to parameter of type ‘uint8_t *’ (aka ‘unsigned char *’) converts between pointers to integer types with different sign。
很明顯,數(shù)據(jù)類型沖突了。但是在程序中我們將兩種方式都進(jìn)行了輸出,最后發(fā)現(xiàn)調(diào)試結(jié)果是正確的。如下圖所示。
這是為什么呢?其實(shí)也很簡單,我們這里進(jìn)行了一個非法操作。當(dāng)我們調(diào)用該函數(shù)時,將字符串?dāng)?shù)組作為實(shí)參,在函數(shù)定義中強(qiáng)制轉(zhuǎn)換成了一個指針。而這個指針,指向的是字符串?dāng)?shù)組的第一個地址,所以該函數(shù)運(yùn)行時就能夠正確輸出我們所編寫的字符串了。
-
顯示器
+關(guān)注
關(guān)注
21文章
5058瀏覽量
141325 -
STM32
+關(guān)注
關(guān)注
2289文章
11006瀏覽量
362139 -
ARM處理器
+關(guān)注
關(guān)注
6文章
361瀏覽量
42411 -
C語言
+關(guān)注
關(guān)注
180文章
7630瀏覽量
140164 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
311瀏覽量
24154
發(fā)布評論請先 登錄
輸出字符串數(shù)組問題
為什么stm32程序使用printf函數(shù)無法通過串口輸出字符串呢
解決讀取TXT文件時輸出字符串亂碼問題
python字符串拼接方式了解
如何利用STM32單片機(jī)串口發(fā)送字符串
基于STM32單片機(jī)發(fā)送字符串的函數(shù)
C語言中字符串拷貝函數(shù)有幾種方法?
利用STM32單片機(jī)串口發(fā)送字符串

STM32串口的介紹與使用(原理、結(jié)構(gòu)體、發(fā)送字符串、printf函數(shù)重定向)

python字符串有哪些特定方法
STM32串口格式化輸出的幾種方法介紹

評論