日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式大雜燴
[導讀]點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記! 常規(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內部從串口發(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ù)需要進行調整 */
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ū)的內容給一次性發(fā)出去。

2、基于STM32標準庫

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

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

#define TX_BUF_LEN  256     /* 發(fā)送緩沖區(qū)容量,根據(jù)需要進行調整 */
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跟我說沒必要用。。。

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

(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ù)用于打印調試。

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

因此我利用上面的思路給它新封裝了一個打印調試函數(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語言、嵌入式重點知識:回調函數(shù)

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

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

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

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

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

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

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



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



點個贊,證明你還愛我

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

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉