>[success] **技术支持说明**
> 1.**客服**提供简单的技术支持,一般自主学习为主
> 2.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/nb-iot)
> 3.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解!
<br/>
本节课将以串口数据接收为例讲解如何创建输入型任务,打开节课配套的工程,如图所示。
![](https://img.kancloud.cn/6b/24/6b24f6b28e7bf67853af8b6104a19f50_346x726.png =250x)
> 本节课的工程代码结构是和上节课的工程源码结构是一样的
<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位打到左边;
![](https://img.kancloud.cn/34/9c/349cceae4177926416445b6daf932d24_664x827.png =200x)
###
* 使用USB线连接开发板到电脑,然后打开串口助手。向串口发送消息后,会看到消息又原封不动地发送回来了,如图所示:
![](https://img.kancloud.cn/e0/30/e030451a06fa2d7ee98ad97cbf8d0a2c_1022x747.png =500x)
<br/>
<br/>
## **商务合作**
如有以下需求,可扫码添加管理员好友,注明“**商务合作**”
* 项目定制开发,技术范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等;
* 入驻平台,成为讲师;
* 接项目赚外快;
* 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/)
![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =150x)
(非商务合作**勿扰**,此处**非**技术支持)
- 课程介绍
- 配套资源下载
- 配套开发套件简介
- 简介
- 硬件组成 & 技术参数
- 电路原理图 & 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. 数据通信任务说明
- 版权声明与免责声明