>[success] **技術支持說明**
> 1.**客服**提供簡單的技術支持,一般自主學習為主
> 2.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/nb-iot)
> 3.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解!
<br/>
本節課將以串口數據接收為例講解如何創建輸入型任務,打開節課配套的工程,如圖所示。

> 本節課的工程代碼結構是和上節課的工程源碼結構是一樣的
<br/>
## **擴展插件服務svc_plugins**
前續課程曾講過插件服務svc\_plugins用于提供一些零碎的服務,本節課為其增加一項服務,即指定接收串口數據的回調函數,代碼如下:
###
```
/*
* 指定接收串口數據的回調函數
* @param callback - 回調函數,當接收到串口數據時,自動調用此函數處理這些數據
*/
void svcPluginsSetUartCallback(void (*callback)(uint8_t byte))
{
halUartSetIRQCallback(callback);
}
```
<br/>
## **擴展輸入型task_input**
串口接收數據也屬于輸入型的任務,因此把相關處理邏輯也放在 task\_input 中,task\_input.c代碼如下:
###
```
#include "task_input.h"
#include "svc_plugins.h"
#include "svc_button.h"
#include "svc_log.h"
#include "svc_task.h"
//用于接收到的串口數據
static uint8_t taskInputMsg[128];//串口數據緩沖區(數組)
static uint8_t taskInputIndex = 0;//數組下標
static void taskInputOnUart(uint8_t byte);
static void taskInputRunner(uint8_t, void *);
static void taskInputOnMsgRunner(uint8_t, void *);
/*
* 輸入型任務初始化
*/
void taskInputInit()
{
/*設置接收到串口數據時的回調函數*/
svcPluginsSetUartCallback(taskInputOnUart);
/*每隔400毫秒執行1次taskInputRunner*/
svcTaskAdd(400, 1, taskInputRunner, 0);
/*每隔60毫秒執行1次taskInputOnMsgRunner*/
svcTaskAdd(60, 1, taskInputOnMsgRunner, 0);
}
/*
* 回調函數,接收到串口數據時會自動調用此函數
* @param byte - 接收到的串口數據
*/
void taskInputOnUart(uint8_t byte)
{
if (taskInputIndex >= sizeof(taskInputMsg))//如果數組下標大于或等于數據長度
return;//結束本函數
taskInputMsg[taskInputIndex++] = byte;//保存數據到緩沖區中
}
/*
* 回調函數,定義此任務的具體工作內容
*/
void taskInputRunner(uint8_t id, void *args)
{
int times = svcButtonClickTimes();
svcButtonClickTimesClear();
if (times == 1)
svcLogWrite((uint8_t *)"TASK[INPUT] single click\n");
else if (times == 2)
svcLogWrite((uint8_t *)"TASK[INPUT] double click\n");
}
/*
* 回調函數,定義此任務的具體工作內容
*/
static void taskInputOnMsgRunner(uint8_t id, void *args)
{
uint8_t buf[sizeof(taskInputMsg)];
if (taskInputIndex == 0) return;//如果數組下標等于0,表示還沒有接收到數據
//獲取數據
for (uint8_t i = 0; i < taskInputIndex; i++)
buf[i] = taskInputMsg[i];
taskInputIndex = 0;//下標歸0
svcLogWrite(buf);//記錄從串口接收到的數據
}
```
<br/>
## **編寫Main函數**
mian函數的內容與上節課一樣,無需改動。
<br/>
## **代碼測試**
* 編譯鏈接工程代碼,把生成的Hex文件燒錄到開發板中;
* 按如圖所示把開發板的撥碼開關的第1~4位打到右邊,第5、6位打到左邊;

###
* 使用USB線連接開發板到電腦,然后打開串口助手。向串口發送消息后,會看到消息又原封不動地發送回來了,如圖所示:

<br/>
<br/>
## **商務合作**
如有以下需求,可掃碼添加管理員好友,注明“**商務合作**”
* 項目定制開發,技術范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等;
* 入駐平臺,成為講師;
* 接項目賺外快;
* 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/)

(非商務合作**勿擾**,此處**非**技術支持)
- 課程介紹
- 配套資源下載
- 配套開發套件簡介
- 簡介
- 硬件組成 & 技術參數
- 電路原理圖 & PCB圖
- 撥碼開關使用說明
- 第一部分:無線通信 開發指南
- 1.1.1 NB-IoT:技術簡介
- 1.1.2 NB:CH34x USB轉串口驅動安裝
- 1.1.3 NB:AT 指令開發與測試
- 1.1.4 NB:基礎指令集簡介
- 1.1.5 NB:云端服務器
- 1.1.5.1 PuTTY 簡介與安裝
- 1.1.5.2 登錄云端服務器
- 1.1.6 NB:移遠官方工具簡介
- 1.1.7 NB:使用UDP協議與云端服務器通信
- 1.1.8 NB:使用TCP協議與云端服務器通信
- 1.1.9 NB:使用MQTT協議與云端服務器通信
- 進階課程
- 第二部分:STM32 開發指南
- 2.1 搭建開發環境
- 2.1.1 Keil MDK 簡介與安裝
- 2.1.2 STM32 Pack 簡介與安裝
- 2.1.3 CH34x 驅動簡介與安裝
- 2.1.4 其他開發工具
- 2.2 STM32 開發基礎
- 2.2.1 新建工程
- 2.2.2 實現第1個程序
- 2.2.3 Hex 文件燒錄詳解
- 2.3 移植官方標準工程模板
- 2.4 GPIO實驗——LED燈
- 2.5 系統延時應用
- 2.6 GPIO實驗——按鍵
- 2.7 GPIO中斷實驗——按鍵觸發
- 2.8 使用定時器TIM3
- 2.9 串口通信實驗
- 2.10 ADC 實驗
- 2.11 OLED顯示器實驗
- 2.12 SDK 設計思想
- 2.13 SDK 架構解析
- 2.14 多任務應用
- 2.15 輸入型任務:按鍵輸入
- 2.16 輸入型任務:串口接收
- 課外篇:項目實戰
- 基于STM32+NB-IoT的溫濕度采集
- 系統簡介
- 系統搭建
- 系統詳解
- 1.代碼編譯與架構說明
- 2.DHT11溫濕度傳感器
- 3. 數據通信任務說明
- 版權聲明與免責聲明