1. 程式人生 > >stm32關於串列埠輸出的幾種常用方式

stm32關於串列埠輸出的幾種常用方式

在使用stm32做專案時,我們常常會使用到串列埠除錯,通過串列埠來輸出我們想要看的相關引數值,這樣既方便有快捷。
具體方法有哪些呢,我自己整理了一下,這個也是借鑑別人的用法而已。希望大家可以相互討論學習。
1、使用printf語句通過串列埠輸出我們想要的引數值
具體的用法:使用之前必須包含相應的標頭檔案#include < stdio.h >

int fputc(int ch, FILE *f)//重定向,讓printf輸出到串列埠
{
    USART_SendData(USART1, (uint8_t) ch);

    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    return
ch; }

使用以上函式那必須在stm32在目標選項中必須勾選Use MicroLIB選項。同時當然需要配置stm32串列埠的相關初始化才可以,這樣就可以使用printf函式來進行串列埠輸出。可以實現在VS下程式設計使用的的printf函式。
這裡寫圖片描述

2、使用巨集定義的方式進行串列埠輸出,其實與printf函式一樣的,只是變了種形式而已,很方便的呼叫所使用的串列埠。
具體的用法:使用之前必須包含相應的標頭檔案#include< stdio.h >

// 定義除錯串列埠
#define DEBUG_UART          UART7

// 是否輸出除錯資訊
#define DEBUG_PRINTF
#ifdef DEBUG_PRINTF #define debug(FORMAT, ...) printf(FORMAT, ##__VA_ARGS__) #else #define debug(FORMAT, ...) #endif
以上,可在檔案的開始巨集定義相關的內容,之後再用使用以下函式進行輸出內容。同時在配置相關的串列埠內容即可使用除錯串列埠。
int fputc(int ch, FILE *f)//重定向,讓printf輸出到串列埠
{
    USART_SendData(DEBUG_UART, (uint8_t) ch);

    while (USART_GetFlagStatus(DEBUG_UART, USART_FLAG_TXE) == RESET);
    return
ch; }

3、使用串列埠傳送單位元組或多字的資料

/*************************************************
 * @函式名稱: USARTx_Send_Byte
 * @函式功能: 串列埠單個位元組
 * @輸入引數: USARTx: 選擇傳送陣列使用的串列埠號
 *           byte:  要傳送的陣列首地址
 * @輸出引數: 無
 * @返回值  : 無
 * @其它說明: 無
 *************************************************/ 
void USARTx_Send_Byte(unsigned char byte) //串列埠傳送一個位元組
{
        USART_SendData(USARTx, byte); //通過庫函式傳送資料
        while( USART_GetFlagStatus(USARTx,USART_FLAG_TC)!= SET);  
        //等待發送完成。  檢測 USART_FLAG_TC 是否置1;     
}
/*************************************************
 * @函式名稱: UARTx_Send_Str
 * @函式功能: 串列埠傳送字串
 * @輸入引數: USARTx: 選擇傳送陣列使用的串列埠號
 *           *s:    要傳送的陣列首地址指標
 * @輸出引數: 無
 * @返回值  : 無
 * @其它說明: 傳送字串函式應用指標方法
 *************************************************/ 
void UARTx_Send_Str(unsigned char *s)
{
        unsigned char i=0; //定義一個區域性變數用來發送字串
        while(s[i]!='\0') //每個字串結尾 都是以"\0" 結尾的
        { 
                 /*通過庫函式傳送資料*/
                USART_SendData(USARTx,s[i]); 
                 /*等待發送完成。檢測 USART_FLAG_TC 是否置1*/
                while( USART_GetFlagStatus(USARTx,USART_FLAG_TC)!= SET);  
                i++;   //i++一次
        }
}
/*************************************************
 * @函式名稱: USART_SendArray
 * @函式功能: 串列埠傳送多位元組
 * @輸入引數: USARTx: 選擇傳送陣列使用的串列埠號
 *            buf   :要傳送的陣列首地址
 *            len   :要傳送的陣列長度
 * @輸出引數: 無
 * @返回值  : 無
 * @其它說明: 無
 *************************************************/ 
void USART_SendArray(USART_TypeDef* USARTx, u8 *buf, u8 len)
{   
  u8 t;
  for(t=0;t<len;t++)//迴圈傳送資料
    {
        //等待發送結束        
        while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET){}; 
       //傳送資料
        USART_SendData(USARTx,buf[t]); 
    }   
    //等待發送結束     
    while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);      
}