色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355748
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 串口打印
    +關注

    關注

    0

    文章

    10

    瀏覽量

    3096

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

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

收藏 人收藏

    評論

    相關推薦

    【敏矽微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 ?338次閱讀

    重定向了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 ?1550次閱讀

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

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

    串口屏的安裝方式方法

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

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

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

    SPWM調制方式是怎樣實現變壓功能的?又是怎樣實現變頻功能的?

    SPWM調制方式是怎樣實現變壓功能的?又是怎樣實現變頻功能的? SPWM是一種常見的調制方式,它
    的頭像 發表于 02-06 11:09 ?1811次閱讀

    SPWM調制方式是怎樣實現變壓功能的?

    SPWM調制方式是怎樣實現變壓功能的? SPWM調制是一種常用的調制方式,用于將直流電壓轉換為交流電壓,同時也可以實現變壓
    的頭像 發表于 02-06 11:08 ?1267次閱讀

    TLE9854 printf函數無法輸出是怎么回事?

    TLE9854 的串口能正常輸出,現在想配置成printf,使能了STDOUT和STDIN,選擇了MicroLIB,可是沒法輸出,懷疑是程序里這個函數沒被調用,這個函數在哪里調用的? void
    發表于 02-02 16:05

    xmc7200使用cy_retarget_io_init_fc功能初始化串口6,為什么printf功能CAN不打印出數據?

    我使用的是xmc7200開發板,使用cy_retarget_io_init_fc功能初始化串口6,為什么printf功能 CAN 不打印出數據?
    發表于 01-30 06:55

    M487JIDAE如何使用ITM功能實現printf打印?

    M487JIDAE如何使用ITM功能實現printf打印?
    發表于 01-16 08:03
    主站蜘蛛池模板: 欧美一区二区视频97色伦| 年轻的老师5理伦片| 久久精品国产eeuss| 老师你狠狂| 欧美亚洲日韩一道免费观看| 日操夜操天天操| 羞羞答答的免费视频在线观看| 亚洲国产欧美日本大妈| 一区精品在线| 999久久免费高清热精品| 把极品白丝班长啪到腿软| 国产精品av免费观看| 黑人玩弄极品人妻系列| 噜妇插内射精品| 日韩在线av免费视久久| 亚洲1卡二卡3卡4卡新区在线| 永久免费的无码中文字幕| 99久久精品免费看国产一区二区| 成人欧美尽粗二区三区AV| 国拍自产精品福利区| 麻豆AV久久AV盛宴AV| 三级黄色在线| 一本道本线中文无码| xxxx69中国| 交换邻居波多野结衣中文字幕 | 色欲狠狠躁天天躁无码中文字幕| 香蕉久久夜色精品国产小说| 在线观看a视频| yy8090韩国理伦片在线| 国色精品VA在线观看免费视频| 米奇在线8888在线精品视频| 无人影院在线播放视频| 在线观看成人3d动漫入口| 高清国产mv视频在线观看| 久久re6热在线视频精品| 日本一二三区在线视频| 一区两区三不卡| 国产精品免费一区二区三区四区 | 最新高清无码专区在线视频| 高清视频在线观看SEYEYE| 久久久精品久久久久特色影视|