1. 程式人生 > 實用技巧 >CC2540任意協議棧例程實現串列埠配置列印輸出、實現串列埠雙工收發

CC2540任意協議棧例程實現串列埠配置列印輸出、實現串列埠雙工收發

一、前言

在平時學習開發板的過程中,無論學習什麼樣的板子,有串列埠除錯的功能會方便很多,可以說在除錯程式碼的過程中,通過串列埠列印輸出資訊對於我們的開發和學習是十分方便的,本片文章來記錄一下使用cc2540任意協議棧例程來實現串列埠資訊的列印和串列埠雙工收發功能。本文是在TI官方協議棧的基礎上進行修改,本文所用的cc2540的協議棧的版本為:BLE-CC254x-1.3.2。

二、總體修改步驟:
【1】 定義串列埠使能

【2】 編寫串列埠接收回調函式 【3】 呼叫串列埠初始化函式 【4】 新增標頭檔案宣告

三、詳細修改過程。

【1】 定義串列埠使能

需要以下定義:xPOWER_SAVING 關閉低功耗功能,這個是在原本的定義當中有的,前邊加一個x是為了關閉低功耗,因為在低功耗的模式下,串列埠不會正常工作。

HAL_UART=TRUE 使能串列埠。

【2】 編寫串列埠接收回調函式

/*
1, 思路:  當串列埠收到資料後,就會馬上呼叫以下回調函式,在實際測試中發現,此回撥
函式呼叫頻繁, 如果你不執行NPI_ReadTransport函式進行讀取, 那麼這個回撥函式就會
頻繁地被執行,但是,你通過串列埠傳送一段資料, 你本意是想處理這一完整一段的資料,所以,
我們在下面引入了時間的處理方法, 也即接收的資料夠多或者超時,就讀取一次資料, 
然後根據當前的狀態決定執行,如果沒有連線上,就把所有資料當做AT命令處理, 如果連線
上了,就把資料送到對端。  ---------------amomcu   2014.08.17
*/ static void NpiSerialCallback( uint8 port, uint8 events ) { (void)port;//加個 (void),是未了避免編譯告警,明確告訴緩衝區不用理會這個變數 if (events & (HAL_UART_RX_TIMEOUT | HAL_UART_RX_FULL)) //串列埠有資料 { uint8 numBytes = 0; numBytes = NPI_RxBufLen(); //讀出串列埠緩衝區有多少位元組 if(numBytes == 0
) { return; } else { //申請緩衝區buffer uint8 *buffer = osal_mem_alloc(numBytes); if(buffer) { //讀取讀取串列埠緩衝區資料,釋放串列埠資料 NPI_ReadTransport(buffer,numBytes); //把收到的資料傳送到串列埠-實現迴環 NPI_WriteTransport(buffer, numBytes); //釋放申請的緩衝區 osal_mem_free(buffer); } } } }

將這段程式碼複製到App目錄下SimpleBLETest.c檔案下(根據自己工程有不用的名稱)。

同時,要記得在檔案開頭宣告一下這個編寫的這個回撥函式。

static void NpiSerialCallback( uint8 port, uint8 events );

【3】 呼叫串列埠初始化函式

既然使用到了串列埠,就需要將串列埠進行初始化。

函式名稱為:

NPI_InitTransport(NpiSerialCallback);//串列埠初始化 波特率預設為115200 形參是回撥函式

【4】 新增標頭檔案宣告

就像在51或者stm32微控制器的程式設計中類似,我們使用串列埠的一些函式,而這些函式已經有TI官方在npi.c中封裝好了,所以我們在其他.c檔案中呼叫時一定要在這個.c檔案中新增標頭檔案宣告,這樣編譯器才不會報錯。

最後編譯一下正常情況應該是不會報錯的。

然後就可以呼叫列印了例如:

  NPI_PrintString("山東科技大學智慧柔性電子實驗室");  
  NPI_PrintString("\r\n"); 

我們可以燒錄到板子上看看效果。

這樣就完成串列埠列印。

同時在編寫的回撥函式中還實現了將串列埠接收的資料在傳送回串列埠的功能。效果如下:

至此,完成了cc2540任意協議棧例程新增串列埠列印的程式碼修改。