0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32—串口輸出字符串的幾種方法

冬至子 ? 來源:一禾嵌入式開發(fā) ? 作者:季鵬 ? 2023-07-22 10:44 ? 次閱讀

C語言中有個(gè)很好用的函數(shù):printf()。printf()是格式化輸出函數(shù),可以按照規(guī)定格式輸出消息。相信每個(gè)工程師開始學(xué)習(xí)的C語言第一課都會(huì)遇到printf(“Hello World! n”);這條語句。

嵌入式開發(fā)中,我們調(diào)試時(shí)時(shí)常需要輸出一些調(diào)試信息,那這時(shí)候printf語句就非常有用了。但是遺憾的是,C標(biāo)準(zhǔn)庫(kù)函數(shù)中默認(rèn)的輸出設(shè)備是顯示器,所以當(dāng)我們進(jìn)行嵌入式開發(fā)的時(shí)候,是不能夠直接使用printf的。如果我們想要方便的在嵌入式開發(fā)中進(jìn)行printf操作,那么就必須重定向printf語句。

我們可以查一下C標(biāo)準(zhǔn)庫(kù)函數(shù),printf語句其實(shí)是使用了一個(gè)函數(shù)int fputc(int ch, FILE *f); 此函數(shù)原本是將字符ch打印到文件指針?biāo)赶虻奈募髦腥サ?,現(xiàn)在我們不需要打印到文件流,而是打印到串口1。我們只需要重新編寫這個(gè)函數(shù)。當(dāng)系統(tǒng)檢測(cè)到用戶編寫的fputc函數(shù)時(shí),就會(huì)調(diào)用用戶所編寫的函數(shù),而不是使用原本的fputc了。

函數(shù)如下:

圖片

注意這里需要使用到頭文件stdio.h,否則FILE類型未定義。以上是基于MDK環(huán)境下,使用MicroLib的情況下重定向printf。還有一種方法是使用半主機(jī)模式。半主機(jī)模式是ARM的一種機(jī)制,不使用microLib庫(kù),實(shí)現(xiàn)ARM應(yīng)用程序代碼的輸入/輸出請(qǐng)求傳至運(yùn)行著調(diào)試器的主機(jī),這樣就可以使用主機(jī)的顯示器和鍵盤,而不需要再ARM系統(tǒng)上搭配顯示器和鍵盤。當(dāng)然,這種做法并不常見,有興趣的同學(xué)可以自己研究一下。

如果這篇文章到這里就結(jié)束了,那么就太常規(guī)了。下面我還要講一個(gè)非常規(guī)的操作以實(shí)現(xiàn)串口輸出字符串。

Printf重定向的方法是非常常規(guī)的,但是我就是不想用,而且我還想調(diào)用一個(gè)函數(shù)就能輸出一串任意的字符串,怎么辦?我就想出了另一種寫法,先貼代碼:

圖片

乍一看,這段代碼非常簡(jiǎn)單啊,就是使用了一個(gè)指針,然后串口輸出的時(shí)候指針指向的地址不停+1啊!但是我們?cè)倏匆幌抡{(diào)用:

圖片

我們這里直接將一個(gè)字符串作為參數(shù)進(jìn)行了傳遞,編譯器報(bào)了一個(gè)警告: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í)也很簡(jiǎn)單,我們這里進(jìn)行了一個(gè)非法操作。當(dāng)我們調(diào)用該函數(shù)時(shí),將字符串?dāng)?shù)組作為實(shí)參,在函數(shù)定義中強(qiáng)制轉(zhuǎn)換成了一個(gè)指針。而這個(gè)指針,指向的是字符串?dāng)?shù)組的第一個(gè)地址,所以該函數(shù)運(yùn)行時(shí)就能夠正確輸出我們所編寫的字符串了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 顯示器
    +關(guān)注

    關(guān)注

    21

    文章

    4862

    瀏覽量

    139353
  • STM32
    +關(guān)注

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352490
  • ARM處理器
    +關(guān)注

    關(guān)注

    6

    文章

    360

    瀏覽量

    41517
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134090
  • 調(diào)試器
    +關(guān)注

    關(guān)注

    1

    文章

    297

    瀏覽量

    23568
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    輸出字符串數(shù)組問題

    3. 要求輸出字符串數(shù)組“ APPLy:sin 頻率,幅度” 其中幅度為數(shù)值類型,由輸入控件設(shè)定。頻率范圍和步長(zhǎng)由輸入控件設(shè)定。例如幅度為2,頻率范圍為1000-8000Hz,步長(zhǎng)1000Hz,輸出字符串
    發(fā)表于 10-20 11:05

    Python字符串的特點(diǎn)和修改字符串的常見四種方法

    Python中修改字符串幾種方法
    發(fā)表于 02-26 16:52

    為什么stm32程序使用printf函數(shù)無法通過串口輸出字符串

    為什么stm32程序使用printf函數(shù)無法通過串口輸出字符串呢?怎樣去解決這個(gè)問題呢?
    發(fā)表于 11-25 06:35

    解決讀取TXT文件時(shí)輸出字符串亂碼問題

    解決讀取TXT文件時(shí)輸出字符串亂碼問題打開TXT文件時(shí)如果內(nèi)容中存在中文,輸出時(shí)會(huì)出現(xiàn)亂碼問題,因?yàn)閘abview默認(rèn)的編碼格式是UTF-8
    發(fā)表于 12-23 14:23

    python字符串拼接方式了解

    ()方法拼接 用string模塊中的Template對(duì)象 例子: fruit1 = ‘a(chǎn)pples’ fruit2 = ‘bananas’ fruit3 = ‘pears’ 要求: 輸出字符串
    發(fā)表于 12-06 10:09 ?989次閱讀

    如何利用STM32單片機(jī)串口發(fā)送字符串

    最近由于要調(diào)試一個(gè)SMS發(fā)送短信的模塊,該模塊需要發(fā)送一系列AT指令,且需要字符串發(fā)送,但是STM32官方給的usart.c中并沒有直接發(fā)送字符串的函數(shù),因此寫了一個(gè)發(fā)送字符串的函數(shù)。
    發(fā)表于 12-10 16:01 ?1.6w次閱讀

    基于STM32單片機(jī)發(fā)送字符串的函數(shù)

    最近由于要調(diào)試一個(gè)SMS發(fā)送短信的模塊,該模塊需要發(fā)送一系列AT指令,且需要字符串發(fā)送,但是STM32官方給的usart.c中并沒有直接發(fā)送字符串的函數(shù),因此寫了一個(gè)發(fā)送字符串的函數(shù)。
    發(fā)表于 01-04 15:05 ?4738次閱讀

    C語言中字符串拷貝函數(shù)有幾種方法

    strcpy,即string copy(字符串復(fù)制)的縮寫。 是C語言標(biāo)準(zhǔn)庫(kù)中實(shí)現(xiàn)字符串拷貝的一個(gè)函數(shù)。 各大公司筆試題最喜歡考的一道題,快來看看,你會(huì)幾種方法? 問:你會(huì)如何實(shí)現(xiàn)這個(gè)函數(shù)呢? 1
    的頭像 發(fā)表于 03-12 14:16 ?4685次閱讀

    利用STM32單片機(jī)串口發(fā)送字符串

    最近由于要調(diào)試一個(gè)SMS發(fā)送短信的模塊,該模塊需要發(fā)送一系列AT指令,且需要字符串發(fā)送,但是STM32官方給的usart.c中并沒有直接發(fā)送字符串的函數(shù),因此寫了一個(gè)發(fā)送字符串的函數(shù)。
    發(fā)表于 11-19 10:36 ?13次下載
    利用<b class='flag-5'>STM32</b>單片機(jī)<b class='flag-5'>串口</b>發(fā)送<b class='flag-5'>字符串</b>

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

    串口相關(guān)知識(shí)1.定義2.通信概念3.USART簡(jiǎn)介串口的結(jié)構(gòu)體串口發(fā)送字符STM32發(fā)送到上位機(jī))串口
    發(fā)表于 12-24 19:08 ?19次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>的介紹與使用(原理、結(jié)構(gòu)體、發(fā)送<b class='flag-5'>字符串</b>、printf函數(shù)重定向)

    python字符串有哪些特定方法

    python字符串序列操作也適用于列表和元組。 python字符串還有獨(dú)有方法,即字符串對(duì)象的函數(shù),其他對(duì)象不可調(diào)用,只有字符串對(duì)象可
    的頭像 發(fā)表于 02-23 15:02 ?604次閱讀

    C語言定義字符串幾種方法

    C語言中定義字符串有哪些方法?
    的頭像 發(fā)表于 03-31 09:41 ?3363次閱讀

    STM32串口格式化輸出幾種方法介紹

    在前兩天介紹的串口輸出中,函數(shù)Usart1_SendStr只能輸出字符串,如果想輸出一個(gè)整型或者其他類型的數(shù)據(jù),單獨(dú)用這個(gè)函數(shù)是不能實(shí)現(xiàn)的。
    的頭像 發(fā)表于 07-22 10:16 ?2536次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>格式化<b class='flag-5'>輸出</b>的<b class='flag-5'>幾種方法</b>介紹

    串口屏LUA教程6-運(yùn)算和字符串處理

    串口屏LUA教程6-運(yùn)算和字符串處理
    發(fā)表于 04-29 13:11 ?11次下載

    python輸出固定長(zhǎng)度的字符串

    Python 是一種強(qiáng)大而靈活的編程語言,具有許多用于處理字符串的功能。在 Python 中,有多種方法可以輸出固定長(zhǎng)度的字符串。下面將詳細(xì)介紹這些
    的頭像 發(fā)表于 11-22 10:41 ?2454次閱讀