當前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導讀]點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記! 常規(guī)打印方法 在STM32的應用中,我們常常對printf進行重定向的方式來把打印信息printf到我們的串口助手。 在MDK環(huán)境中,我們常常使用MicroLIB+fputc的方式實現(xiàn)串口打印功能,即: 要實

點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記!

常規(guī)打印方法

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

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


要實現(xiàn)fputc函數(shù)的原因是:printf函數(shù)依賴于fputc函數(shù),重新實現(xiàn)fputc內(nèi)部從串口發(fā)送數(shù)據(jù)即可間接地實現(xiàn)printf打印輸出數(shù)據(jù)到串口。

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

#if 1
#pragma import(__use_no_semihosting)
//標準庫需要的支持函數(shù)
struct __FILE
{

    int handle;
};

FILE __stdout;
/**
 * @brief 定義_sys_exit()以避免使用半主機模式
 * @param void
 * @return  void
 */

void _sys_exit(int x)
{
    x = x;
}

int fputc(int ch, FILE *f)
{
    while((USART1->ISR & 0X40) == 0); //循環(huán)發(fā)送,直到發(fā)送完畢

    USART1->TDR = (u8) ch;
    return ch;
}
#endif

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

自己實現(xiàn)一個打印函數(shù)

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

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

int printf (const char *__format, ...);

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

1、基于STM32的HAL庫

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

#define TX_BUF_LEN  256     /* 發(fā)送緩沖區(qū)容量,根據(jù)需要進行調(diào)整 */
uint8_t TxBuf[TX_BUF_LEN];  /* 發(fā)送緩沖區(qū)                       */
void MyPrintf(const char *__format, ...)
{
  va_list ap;
  va_start(ap, __format);
  
  /* 清空發(fā)送緩沖區(qū) */
  memset(TxBuf, 0x0, TX_BUF_LEN);
  
  /* 填充發(fā)送緩沖區(qū) */
  vsnprintf((char*)TxBuf, TX_BUF_LEN, (const char *)__format, ap);
  va_end(ap);
  int len = strlen((const char*)TxBuf);
  
  /* 往串口發(fā)送數(shù)據(jù) */
  HAL_UART_Transmit(&huart1, (uint8_t*)&TxBuf, len, 0xFFFF);
}

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

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

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

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

2、基于STM32標準庫

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

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

#define TX_BUF_LEN  256     /* 發(fā)送緩沖區(qū)容量,根據(jù)需要進行調(diào)整 */
uint8_t TxBuf[TX_BUF_LEN];  /* 發(fā)送緩沖區(qū)                       */
void MyPrintf(const char *__format, ...)
{
  va_list ap;
  va_start(ap, __format);
    
  /* 清空發(fā)送緩沖區(qū) */
  memset(TxBuf, 0x0, TX_BUF_LEN);
    
  /* 填充發(fā)送緩沖區(qū) */
  vsnprintf((char*)TxBuf, TX_BUF_LEN, (const char *)__format, ap);
  va_end(ap);
  int len = strlen((const char*)TxBuf);
  
  /* 往串口發(fā)送數(shù)據(jù) */
  for (int i = 0; i < len; i++)
  {
 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);    
 USART_SendData(USART1, TxBuf[i]);
  }
}


測試結果:


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


以上就是我們自定義方式實現(xiàn)的一種串口打印函數(shù)。

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

看到這,是不是有人想要打我了。。。??戳税胩欤銋s跟我說沒必要用。。。

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

(1)應用一:

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

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

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

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

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

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

(2)應用二:

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

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


最后

以上就是本次的分享。如有錯誤,歡迎指出!謝謝

本篇筆記會同步至我的個人博客:https://www.lizhengnian.cn/中,歡迎來訪。

原創(chuàng)不易,期待您的在看、分享~

粉絲福利

非常感謝大家一直以來的支持,這里我給大家申請到了一個小福利:本公眾號的粉絲朋友可享有小熊派開發(fā)板9折優(yōu)惠福利,有需要的朋友可聯(lián)系我獲取優(yōu)惠碼。


猜你喜歡:

串口通訊你真的會了嗎?不妨看看這些經(jīng)驗

C語言、嵌入式中幾個非常實用的宏技巧

C語言、嵌入式重點知識:回調(diào)函數(shù)

C語言、嵌入式位操作精華技巧大匯總

【Linux筆記】設備樹實例分析

【Linux筆記】通俗易懂的Linux驅動基礎

【Linux筆記】pc機_開發(fā)板_ubuntu互ping實驗

學習STM32的一些經(jīng)驗分享

基于LiteOS的智慧農(nóng)業(yè)案例實驗分享

從單片機工程師的角度看嵌入式Linux



后臺回復:加群。添加ZhengN微信,加入交流群



點個贊,證明你還愛我

免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉