衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用MicroLIB+fputc的方式實現串口打印功能

GReq_mcu168 ? 來源:玩轉單片機 ? 2020-08-05 10:52 ? 次閱讀

常規打印方法

STM32的應用中,我們常常對printf進行重定向的方式來把打印信息printf到我們的串口助手。

在MDK環境中,我們常常使用MicroLIB+fputc的方式實現串口打印功能,即:

要實現fputc函數的原因是:printf函數依賴于fputc函數,重新實現fputc內部從串口發送數據即可間接地實現printf打印輸出數據到串口。

不知道大家有沒有看過正點原子裸機串口相關的例程,他們的串口例程里不使用MicroLIB,而是使用標準庫+fputc的方式。相關代碼如:

#if1 #pragmaimport(__use_no_semihosting) //標準庫需要的支持函數 struct__FILE { inthandle; }; FILE__stdout; /** *@brief定義_sys_exit()以避免使用半主機模式 *@paramvoid *@returnvoid */ void_sys_exit(intx) { x=x; } intfputc(intch,FILE*f) { while((USART1->ISR&0X40)==0);//循環發送,直到發送完畢 USART1->TDR=(u8)ch; returnch; } #endif

關于這兩種方法的一些說明可以查看Mculover666兄的《重定向printf函數到串口輸出的多種方法》這篇文章。這篇文章中不僅包含上面的兩種方法,而且也包含著在GCC中使用標準庫重定向printf的方法。

自己實現一個打印函數

以上的幾種方法基本上是改造C庫的printf函數來實現串口打印的功能。其實我們也可以自己實現一個串口打印的功能。

printf本身就是一個變參函數,其原型為:

intprintf(constchar*__format,...);

所以,我們要重新封裝的一個串口打印函數自然也應該是一個變參函數。具體實現如下:

1、基于STM32的HAL庫

左右滑動查看全部代碼>>>

#defineTX_BUF_LEN256/*發送緩沖區容量,根據需要進行調整*/ uint8_tTxBuf[TX_BUF_LEN];/*發送緩沖區*/ voidMyPrintf(constchar*__format,...) { va_listap; va_start(ap,__format); /*清空發送緩沖區*/ memset(TxBuf,0x0,TX_BUF_LEN); /*填充發送緩沖區*/ vsnprintf((char*)TxBuf,TX_BUF_LEN,(constchar*)__format,ap); va_end(ap); intlen=strlen((constchar*)TxBuf); /*往串口發送數據*/ HAL_UART_Transmit(&huart1,(uint8_t*)&TxBuf,len,0xFFFF); }

因為我們使用printf函數基本不使用其返回值,所以這里直接用void類型了。

自定義變參函數需要用到va_start、va_end等宏,需要包含頭文件stdarg.h。關于變參函數的一些學習可以查看網上的一些博文,如:

https://www.cnblogs.com/wulei0630/p/9444062.html

這里我們使用的是STM32的HAL庫,其給我們提供HAL_UART_Transmit接口可以直接把整個發送緩沖區的內容給一次性發出去。

2、基于STM32標準庫

若是基于STM32的標準庫,就需要一字節一字節的循環發送出去,具體代碼如:

左右滑動查看全部代碼>>>

#defineTX_BUF_LEN256/*發送緩沖區容量,根據需要進行調整*/ uint8_tTxBuf[TX_BUF_LEN];/*發送緩沖區*/ voidMyPrintf(constchar*__format,...) { va_listap; va_start(ap,__format); /*清空發送緩沖區*/ memset(TxBuf,0x0,TX_BUF_LEN); /*填充發送緩沖區*/ vsnprintf((char*)TxBuf,TX_BUF_LEN,(constchar*)__format,ap); va_end(ap); intlen=strlen((constchar*)TxBuf); /*往串口發送數據*/ for(inti=0;i

測試結果:

我們也可以使用我們的MyPrintf函數按照上一篇文章:《C語言嵌入式中幾個非常實用的宏技巧》的方式封裝一個宏打印函數:

以上就是我們自定義方式實現的一種串口打印函數。

但是,我想說:對于串口打印的使用,我們沒必要自己創建一個打印函數。

看到這,是不是有人想要打我了。。。。看了半天,你卻跟我說沒必要用。。。

哈哈,別急,我們不應用在串口打印調試方面,那可以用在其它方面呀。

(1)應用一:

比如最近我在實際應用中:我們的MCU跑的是我們老大自己寫的一個小的操作系統+我們公司自己開發的上位機

我們MCU端與上位機使用的是串口通訊,MCU往上位機發送的數據有兩種類型,一種是HEX格式數據,一種是字符串數據。

但是我們下位機的這兩種數據,在通過串口發送之前都得統一把數據封包交給那個系統通信任務,然后再由通信任務發出去。

在這里,就不能用printf了。老大也針對他的這個系統實現了一個deb_printf函數用于打印調試。

但是,那個函數既復雜又很雞肋,稍微復雜一點的數據就打印不出來了。

因此我利用上面的思路給它新封裝了一個打印調試函數,很好用,完美地兼容了老大的那個系統。具體代碼就不分享了,大體代碼、思路如上。

(2)應用二:

我們在使用串口與ESP8266模塊通訊時,可利用類似這樣的方式封裝一個發送數據的函數,這個函數的使用可以像printf一樣簡單。

可以以很簡單的方式把數據透傳至服務端,比如我以前的畢設中就有這么應用:

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2272

    文章

    10924

    瀏覽量

    357608
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62979
  • 串口打印
    +關注

    關注

    0

    文章

    10

    瀏覽量

    3124

原文標題:串口打印知多少?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【RA-Eco-RA2L1-48PIN-V1.0開發板試用】——使用串口輸出打印printf實現

    上一篇我講解了使用JINK RTT來實現串口輸出打印printf函數功能, 本次測評我來講解另外一種串口
    發表于 01-23 12:20

    【RA-Eco-RA2L1-48PIN-V1.0開發板試用】——使用Jlink的RTT實現串口打印功能

    能干瞪眼了?????? 當然不行啊,剛好JLINK自帶的RTT就能彌補這個缺陷,它能進行串口printf打印的所有功能。 本期測評就讓我來給大家講解一下使用JLINK的RTT實現pri
    發表于 01-23 11:33

    串口與Wi-Fi的連接方式

    在現代通信技術中,串口和Wi-Fi是兩種常見的數據傳輸方式串口通信以其簡單、穩定的特性在工業控制、嵌入式系統等領域得到廣泛應用。而Wi-Fi作為無線局域網技術,因其靈活性和便捷性在家庭、辦公等環境
    的頭像 發表于 12-27 10:10 ?363次閱讀

    串口通訊異常處理方法 串口設備連接方式

    串口通信異常處理方法 1. 異常檢測 在串口通信中,首先需要能夠檢測到異常情況。異常檢測可以通過以下幾種方式實現: 硬件檢測 :利用串口硬件
    的頭像 發表于 12-27 09:53 ?704次閱讀

    【敏矽微ME32G070開發板免費體驗】使用JLINK的RTT功能實現類似串口printf打印功能

    是壞的,非常影響我的測評使用。 我這個串口是壞的,非常影響我的測評使用。 我這個串口是壞的,非常影響我的測評使用。 為了先代替串口打印功能
    發表于 12-15 20:30

    【RA-Eco-RA4E2-64PIN-V1.0開發板試用】串口打印功能

    剛剛點燈完畢,現在來實現RA4E2的串口打印功能,先打開原理圖,我們看到 串口使用的是P109和P110兩個IO口,然后我們來進行配置 先打
    發表于 12-13 13:08

    打印針控制機構實現打印針的什么和什么動作

    打印針控制機構實現打印針的 出針 和 收針 動作。這是針式打印打印過程中的關鍵環節。打印針控制
    的頭像 發表于 10-14 15:45 ?471次閱讀

    重定向了fputc及putchar函數,但printf沒有輸出,為什么?

    重定向了fputc及putchar函數,但printf沒有輸出 刪除了drivers/drv_uart.c drv_uart.h 刪除了文件rt-thread\\components
    發表于 07-18 07:44

    單獨打印UART_test時串口可以打印,添加以下代碼后串口打印,為什么?

    單獨打印UART_test時串口可以打印,添加以下代碼后串口打印。代碼看附件截圖
    發表于 06-27 06:21

    esp32c3能不能將串口打印函數重定向到自己軟件模擬的uart上?

    軟件環境:esp-idf v4.3 硬件環境:esp32c3 問題描述:因為項目里面需要使用到3個uart:2個其他功能規劃+1個日志打印調試;由于c3只有兩個串口資源,所以我們打算用一個io引腳來
    發表于 06-20 06:32

    串口屏的幾種安裝方式

    串口屏的幾種安裝方式
    的頭像 發表于 05-10 11:28 ?1687次閱讀

    有誰知道如何在熱敏打印機中實現圖片的灰階打印效果嗎?

    有誰知道如何在熱敏打印機中實現圖片的灰階打印效果。 現在基本上文字打印,圖片打印功能都已開發結束
    發表于 04-24 15:43

    串口屏的安裝方式方法

    串口屏的安裝方式方法
    的頭像 發表于 04-02 16:25 ?1567次閱讀

    如何添加microLib庫?cubeIDE是否支持添加microLib庫?

    如何添加microLib庫?cubeIDE是否支持添加microLib庫?
    發表于 03-08 08:21

    CX3中如何同時使用串口的debug功能串口的收發功能

    單獨使用CyFxDebugInit功能 status = CyU3PUartSetConfig ( uartConfig, NULL);進行 CyU3PDebugPrint打印都好使。參考歷程
    發表于 02-27 07:12
    上游棋牌下载| 凯旋门百家乐游戏| 新皇冠现金网| 大玩家百家乐现金网| 威尼斯人娱乐网代理| 美女百家乐官网的玩法技巧和规则 | 柯坪县| 上市百家乐.评论| 百家乐官网庄不连的概率| 百家乐天下| 24 山杨公斗首择日吉凶| 高淳县| 巨星百家乐的玩法技巧和规则| 线上百家乐官网是如何作弊| 博赢国际娱乐城| 百家乐视频软件下载| 百家乐官网桌出租| 六合彩现场| 大三巴百家乐的玩法技巧和规则 | 百佬汇百家乐官网的玩法技巧和规则| 中西区| 太阳城假日酒店| 四方百家乐官网的玩法技巧和规则 | 威尼斯人娱乐城 线路畅通中心 | 军事| 大发888真坑阿| 广州百家乐牌具公司| 百博百家乐官网的玩法技巧和规则 | 拜泉县| 永利高足球网| 爱赢百家乐开户送现金| 百家乐官网扑克桌| 金昌市| 大发888下载安全的| 百家乐庄家必赢诀窍| 百家乐官网投注方法投资法| 国外博彩网站| 威尼斯人娱乐城首选大丰收| 澳门百家乐的公式| 玩百家乐官网去哪个娱乐城最安全| 北京百家乐官网网上投注|