ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[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) (非商务合作**勿扰**,此处**非**技术支持)