在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

常規(guī)打印方法

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

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

要實現fputc函數的原因是:printf函數依賴于fputc函數,重新實現fputc內部從串口發(fā)送數據即可間接地實現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);//循環(huán)發(fā)送,直到發(fā)送完畢 USART1->TDR=(u8)ch; returnch; } #endif

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

自己實現一個打印函數

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

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

intprintf(constchar*__format,...);

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

1、基于STM32的HAL庫

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

#defineTX_BUF_LEN256/*發(fā)送緩沖區(qū)容量,根據需要進行調整*/ uint8_tTxBuf[TX_BUF_LEN];/*發(fā)送緩沖區(qū)*/ voidMyPrintf(constchar*__format,...) { va_listap; va_start(ap,__format); /*清空發(fā)送緩沖區(qū)*/ memset(TxBuf,0x0,TX_BUF_LEN); /*填充發(fā)送緩沖區(qū)*/ vsnprintf((char*)TxBuf,TX_BUF_LEN,(constchar*)__format,ap); va_end(ap); intlen=strlen((constchar*)TxBuf); /*往串口發(fā)送數據*/ 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接口可以直接把整個發(fā)送緩沖區(qū)的內容給一次性發(fā)出去。

2、基于STM32標準庫

若是基于STM32的標準庫,就需要一字節(jié)一字節(jié)的循環(huán)發(fā)送出去,具體代碼如:

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

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

測試結果:

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

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

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

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

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

(1)應用一:

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

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

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

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

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

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

(2)應用二:

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

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

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

    關注

    2291

    文章

    11019

    瀏覽量

    363046
  • 函數
    +關注

    關注

    3

    文章

    4374

    瀏覽量

    64417
  • 串口打印
    +關注

    關注

    0

    文章

    10

    瀏覽量

    3218

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    【HarmonyOS 5】桌面快捷方式功能實現詳解

    【HarmonyOS 5】桌面快捷方式功能實現詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應用服務##鴻蒙金融類應用 (金融理財# 一、前言 在移動應用開發(fā)中,如何讓用戶快速觸達核心
    的頭像 發(fā)表于 06-21 16:42 ?57次閱讀
    【HarmonyOS 5】桌面快捷<b class='flag-5'>方式</b><b class='flag-5'>功能</b><b class='flag-5'>實現</b>詳解

    【RA4L1-SENSOR】+ RA4L1-SENSOR開發(fā)版之使用Jlink的RTT打印功能代替串口

    上一篇帖子中我已經實現了板子上的串口USART9進行輸出打印,這篇帖子我采用另外一種串口打印實現
    發(fā)表于 06-09 09:03

    【RA4L1-SENSOR】+ RA4L1-SENSOR開發(fā)版串口打印功能printf實現

    很高興收到瑞薩RA生態(tài)工作室給與試用的RA4L1-SENSOR開發(fā)板,本期就來講解使用RA4L1-SENSOR開發(fā)板實現串口打印功能! 1。打開原理圖 可以知道板載的USB
    發(fā)表于 06-08 15:01

    【RA-Eco-RA4M2開發(fā)板評測】使用Jlink的RTT來實現串口打印功能

    用。 但是在實際開發(fā)如果沒有預留串口怎么辦?其實我們的下載器是可以用來作為調試打印來用的,只是很多小伙伴不知道這個功能而已,今天就來說一下如何用調試器JLink來打印信息。 1、JLi
    發(fā)表于 04-30 12:19

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

    誰知道如何在熱敏打印機中實現圖片的灰階打印效果。 現在基本上文字打印,圖片打印功能都已開發(fā)結束,
    發(fā)表于 04-03 08:40

    STM32CubeIDE STM32H743XIH6串口無法重定向,且發(fā)送內容波特率不對亂碼怎么解決?

    (\"0123rn\"), 100);為亂碼。 但是相同的配置,使用STM32CubeMX+keil勾選MicroLIB完全沒問題 波特率都是默認的115200,只是把引腳改為
    發(fā)表于 03-11 06:42

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

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

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

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

    串口與Wi-Fi的連接方式

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

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

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

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

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

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

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

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

    打印針控制機構實現打印針的 出針 和 收針 動作。這是針式打印打印過程中的關鍵環(huán)節(jié)。打印針控制
    的頭像 發(fā)表于 10-14 15:45 ?852次閱讀

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

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

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

    單獨打印UART_test時串口可以打印,添加以下代碼后串口打印。代碼看附件截圖
    發(fā)表于 06-27 06:21
    主站蜘蛛池模板: 屁股趴过来欠打高h | 色吧色吧色吧网 | 狠狠操夜夜爱 | 99热99热 | 免费观看成年欧美1314www色 | 色五月激情小说 | 性久久久久久久 | 超人碰碰碰人人成碰人 | 午夜久久福利 | 三级网站视频 | 拍拍拍无挡视频免费全程1000 | 狠狠色狠狠色综合日日小蛇 | 欧洲综合网 | 国产在线麻豆自在拍91精品 | 成人在线观看网站 | 高清激情小视频在线观看 | 欧美又黄又嫩大片a级 | 亚洲韩国在线一卡二卡 | 国产免费一区二区三区在线 | 人人干人人艹 | 免费激情网站 | 欧美 亚洲 国产 精品有声 | 国产精品一区二区三 | 欧美亚洲h在线一区二区 | 天天碰人人 | 成人最新午夜免费视频 | 国产精品欧美激情第一页 | 九九视频这里只有精品 | 一区二区三区无码高清视频 | 麦克斯奥特曼在线观看 | 日本经典在线三级视频 | 午夜影院在线观看 | 国内自拍2021 | 美女黄页黄频 | 亚州视频一区 | 午夜色大片在线观看 | 永久免费的啪啪免费的网址 | 色综合 成人| 天天舔天天操 | 国产成人高清精品免费5388密 | 日日噜噜噜夜夜爽爽狠狠图片 |