zigbee智能家居系统转载文章

我无法掩饰自己的机动之情,太感谢原创作者。这几天我一直很愁自己什么都不会。真心想拜拜大神。赶紧的转过来。出处http://blog.csdn.net/u013704336/article/details/50850926

硬件电路的设计

硬件电路主要包括以下几个:

  • 主控电路
  • 传感器电路
  • 通讯电路

下面就分别讲解着三个电路的设计

主控电路设计

  主控电路采用的是STM32F103C8T6单片机,关于为什么选择这个型号的,主要有两个原因,一是稍微便宜一些,淘宝上便宜一点的6块多大洋就可以了;二是因为综合考虑了下我能使用到的资源,选择这个型号的已经够用了。如下图所示:

  主控电路实际上就是一个单片机的最小系统的设计,而最小系统的设计主要包括:电源部分、晶振部分、程序下载部分、芯片电路部分。其中下载电路可以根据自己的需要进行设计,可以选择USB下载或者JTAG下载,两种方式根据自己的实际情况进行选择。

以下是我的主控部分的电路原理图: 
 
STM32最小系统原理图

  从图中可以看出,我的硬件中同时有USB下载和JTAG下载,方便后期根据自己情况进行选择,在程序调试过程中,不得否认JTAG的作用还是挺大的,调试非常的方便。   

传感器电路设计

  本次使用到的传感器主要有:DS18B20(温度传感器),MQ_2(烟雾传感器).DHT11(温湿度传感器),TELESKY(光敏传感器),HC-SR501(人体红外感应模块)、BEEP(蜂鸣器)。这几个传感器很普通,也就是常见的模块,以下是主要的电路图:

DS18B20(温度传感器)

这里写图片描述 
  DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器。具有体积小,硬件开销低,抗干扰能力强、精度高的特点,测量温度范围为-55~+125℃,精度为±0.5℃。现场温度直接以“一总线“的数字方式传输,打打提高了系统的抗干扰性。为了方便,设定分辨率及报警温度存储在EEPROM中,掉电后任然保存。

  DS18B20测温原理下图示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。

  DS18B20通讯方式为单总线结构! 
所有的单总线器件要求采用严格的信号时序,以保证数据的完整性。 DS18B20 共有 6 种信号类型:复位脉冲、应答脉冲、写 0、写 1、读 0 和读 1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。 
  其他详细介绍可以查看芯片手册。或者从我后期资料包中寻找。


DHT11(温湿度传感器)

这里写图片描述

  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

  DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

主要参数:

  • 工作电压范围:3.3V-5.5V
  • 工作电流 :平均0.5mA
  • 输出:单总线数字信号
  • 测量范围:湿度20~90%RH,温度0~50℃
  • 精度 :湿度±5%,温度±2℃
  • 分辨率 :湿度1%,温度1℃

DHT11通信方式也是属于单总线,和DS18B20类似。


MQ_2(烟雾传感器)

这里写图片描述

  该模块有两种方式进行数据采集,模拟和数字。这里我选择的是模拟量的,因为我的上位机需要历史数据,数字式的只有0和1。具体介绍可以从代码中看出。


HC-SR501(人体红外感应模块)

这里写图片描述 
  当有人进入其感应范围则输入高电平,人离开感应范围则自动延时关闭高电平。输出低电平。因此这个模块很容易编写代码进行驱动。


TELESKY(光敏传感器)

这里写图片描述 
光敏传感器和烟雾传感器驱动方式很类似,都可以利用STM32内部的ADC进行驱动转化,进而可以得到更加准确的数据。



这篇博客就来说说界面的问题吧

界面的实现

打开下位机系统第一版,发现它是这个样子的,才想起来自己当时只是想在PC机上跑跑而已,而如今已经跑在了ARM板上。 
这里写图片描述


最终版本的界面如下图所示: 
这里写图片描述

最初设计的时候界面我全部是使用控件拖出来的,这样开发很快,但是也有弊端。 
这里写图片描述

怎么样,界面很朴素吧,剩下的工作全部交给QSS就可以了。 
在上图中,4个按钮都是ToolButton,然后设置对应的Icon就行了,因为QToolButton能够设置文本和图标,所以选择了ToolButton,这样就可以设置文本显示在图标的下边了。

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">    tbn<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setAutoRaise(<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>);
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//设置文本在图标下边</span>
    tbn<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>setToolButtonStyle(Qt<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::ToolButtonTextUnderIcon</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

界面中的其他图标设置样式都是类似的,只不过是大小策略的不同而已,关于界面实现的细节,通过修改样式表完全可以解决,样式表我就不做过多的介绍,因为官方的文档介绍的太详细了。 
http://doc.qt.io/qt-4.8/stylesheet-examples.html

这里写图片描述


数据通信介绍

简述

从题目中可以看出使用的是zigbee进行通信的,但是,仔细一想,通信的接口到头来还是串口,因此上位机通信编程其实就是串口编程了,说到串口,Qt5已经给我们封装好了类,只需在工程配置文件中添加QT += serialport就可以直接进行调用相关类了。


到了Qt4里面是没有这个类的。由于Qt4中没有串口类,只要5里边有,因此很多时候是直接使用的第三串口方库,直接将它添加到我们自己的工程当中来使用的,出于方便,也可以直接使用Qt4自带的qmake将库编译到Qt4库当中,以后想用的话直接使用就可以了。使用的时候需要在.pro文件中包含进来: 
这里写图片描述

编译第三方串口类

可以直接下载Qt 5的串口部分源码,注意是串口部分的源码,当然你也可以全部下载,那样就比较耗时,Qt很友好的给我们提供了模块下载,这真的是非常好的。 
下载地址: 
串口源码下载(http://download.qt.io/archive/qt/5.1/5.1.1/submodules/

打开后会发现设计到串口相关的有4个压缩包,在window下的话就直接下载第一个(红色圈起来的部分),当然也可以下载第二个也行了。这份源码可以在不同平台进行编译一次,这样你的代码移植性就比较好。这里只介绍在windows下的编译,其他平台的编译方法类似。

这里写图片描述

下载源码后,打开cmd命令窗口(前提是你的qt环境变量已经配置,若没有配置则直接使用Qt command),进入到串口源码目录,执行qmake qtserialport.pro,此时会生成Makefile文件,然后make && make install。会在编译完成后安装到Qt的目录下面。 
编译安装完成后到Qt4安装目录查看,确实有了: 
include路径 
这里写图片描述

lib路径: 
这里写图片描述

这里说明一下为什么要使用Qt5的源码进行编译,而不使用第三方串口类。因为Qt5串口类中有个QSerialPortInfo这个类,有了这个可以进行查看当前串口设备信息,这是很方便的,以前使用第三方串口类的时候并没有发现那样的放,要想实现列举当前串口设备,在window下是查看注册表来是现代,不过这样不通用,在linux下没有试过,因此直接编译了Qt5的串口类。在使用上差不多是一样的。


通信协议

设计到通信部分,协议肯定是少不了的,工业控制方面目前比较有名的协议有Modbus、BACnet等,其中Modbus是比较有名的。我这里只是简单的对设备进行了定义,并没有使用上述复杂的协议。 
这里列举一部分出来 
模块类型宏定义和枚举 
这里写图片描述

数据包: 
这里写图片描述

对一帧数据必须进行区分是发送的命令还是数据,这里做了简单的区分,实际中可以在添加奇偶校验位,对数据校验。要发送出去还必须对数据进行打包处理,完了从我源码中可以查看,这里就不足过多的介绍了。

数据解析

关于串口通信编程部分,我就不写了,网上写的比我详细多了。其实使用串口编程也很简单,设置几个参数再进行判断即可。在串口打开后数据传输都放在了线程里边进行接收与发送,效率还是可以的,可能我的数据量太小的缘故吧。 
数据接收时需要注意的一点就是对开始接收到数据大小进行一个判断,否则可能造成数据丢失。必须使用bytesAvailable()函数对接收到的数据进行判断,小于某个数就返回再读取,否则收到的数据不完整。 
这里写图片描述


实现原理

以下会分别介绍下位机中关键部分的实现技术,包括μC/OS-II多任务实现、串口数据的读取、对数据的解析等。首先看一张下位机整体结构图,这样心里就有了比较清晰的框架了:

这里写图片描述

下位机硬件资源介绍

  1. zigbee核心板
  2. DS18B20模块(温度传感器)
  3. MQ_2(烟雾传感器)
  4. 客厅LED流水灯(模拟真实环境)
  5. 蜂鸣器
  6. DHT11(温湿度传感器)
  7. 卧室LED灯
  8. 光敏传感器
  9. HCSR501(人体热释电)
  10. 系统检测灯
  11. MCU(STM32F103C8T6)

μC/OS-II多任务的实现

μC/OS-II是一个可裁剪的、可固话的、可移植的、抢占式实时多任务系统内核,适用于多种微处理器和微控制器,能够移植到超过100多种微处理器应用开发中。本次下位机中就移植了这样一个小型的嵌入式操作系统,使得整个系统显示十分的流畅,而且也很好管理。

μC/OS-II的移植这里就不说了,网上有好多的介绍,其中正点原子和野火的讲的都比较详细,可以去看看,首先说明,我的这个工程也是参考他们的。一下是我的整个工程的结构,整体上还算比较详细的:

这里写图片描述

通过代码可以很清晰的看出来各个传感器的 驱动、数据的读取等细节,这里主要说说系统多的任务的实现。

主函数开始后进行了一些列的初始化操作,随后初始化了μC/OS-II系统,并且创建了一个开始任务: 
各个模块初始化操作:

<code class="hljs scss has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">    <span class="hljs-function" style="box-sizing: border-box;">delay_init()</span>;                   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//延时初始化   </span>
    <span class="hljs-function" style="box-sizing: border-box;">uart_init(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">115200</span>)</span>;              <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//串口1初始化</span>
    <span class="hljs-function" style="box-sizing: border-box;">uart3_init(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">115200</span>)</span>;             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//串口3初始化(连接ZigBee接口)</span>
    <span class="hljs-function" style="box-sizing: border-box;">JTAG_Set(JTAG_SWD_DISABLE)</span>;     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//关闭JTAG接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">NVIC_Configuration()</span>;           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//设置NVIC中断分组2:2位抢占优先级,2位响应优先级</span>
    <span class="hljs-function" style="box-sizing: border-box;">BEEP_Init()</span>;                    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化蜂鸣器接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">LED_Init()</span>;                         <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化与LED连接的硬件接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">Scan_Key_Configuration()</span>;       <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化按键接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">STEP_MOTOR_Start()</span>;             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化步进电机接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">Lsens_Init()</span>;                           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化光敏传感器接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">MQ_2_Configuration()</span>;           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化烟雾传感器接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">HC_SR501_GPIO_Configuration()</span>;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化红外热释点接口</span>
    <span class="hljs-function" style="box-sizing: border-box;">STEP_MOTOR_Configuration()</span>;     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化步进电机接口</span>

    <span class="hljs-function" style="box-sizing: border-box;">while(<span class="hljs-function" style="box-sizing: border-box;">DHT11_Init()</span>)</span>             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//DHT11初始化,检测不到会卡死在这里   </span>
     {
<span class="hljs-id" style="box-sizing: border-box;">#if</span> FLAG_SHOW_VALUE
        <span class="hljs-function" style="box-sizing: border-box;">printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\r\nDHT11 Init Error"</span>)</span>;
<span class="hljs-id" style="box-sizing: border-box;">#endif</span>
             <span class="hljs-function" style="box-sizing: border-box;">delay_ms(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>)</span>;
     }
<span class="hljs-id" style="box-sizing: border-box;">#if</span> FLAG_SHOW_VALUE
     <span class="hljs-function" style="box-sizing: border-box;">printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"DHT11 OK\r\n"</span>)</span>;
<span class="hljs-id" style="box-sizing: border-box;">#endif</span>

    <span class="hljs-function" style="box-sizing: border-box;">while(<span class="hljs-function" style="box-sizing: border-box;">DS18B20_Init()</span>)</span>           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化DS18B20,检测不到会卡死在这里不断检测</span>
    {
        <span class="hljs-function" style="box-sizing: border-box;">printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\r\nDS18B20 Init Error"</span>)</span>;
              <span class="hljs-function" style="box-sizing: border-box;">delay_ms(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span>)</span>;
    }
     <span class="hljs-function" style="box-sizing: border-box;">printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"DS18B20 Init OK\r\n"</span>)</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul>

创建开始任务:

<code class="hljs scss has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">    <span class="hljs-function" style="box-sizing: border-box;">OSInit()</span>;   
    <span class="hljs-function" style="box-sizing: border-box;">OSTaskCreate(start_task,(void *)</span>0,(OS_STK *)&START_TASK_STK<span class="hljs-attr_selector" style="color: rgb(0, 136, 0); box-sizing: border-box;">[START_STK_SIZE-1]</span>,START_TASK_PRIO );<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建起始任务</span>
    <span class="hljs-function" style="box-sizing: border-box;">OSStart()</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

开始任务创建成功后便会在开始任务里边进行其他任务的初始化操作:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//开始任务</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> start_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata)
{
        OS_CPU_SR cpu_sr = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        pdata = pdata;                            
        OSStatInit();                           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化统计任务.这里会延时1秒钟左右    </span>
        OS_ENTER_CRITICAL();            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//进入临界区(无法被中断打断) </span>


    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//红外热释任务</span>
    OSTaskCreate(hc_sr501_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    (OS_STK*)&HC_SR501_TASK_STK[HC_SR501_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],HC_SR501_TASK_PRIO);

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建温湿度任务</span>
    OSTaskCreate(dht11_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    (OS_STK*)&DHT11_TASK_STK[DHT11_STK_SIZE - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],DHT11_TASK_PRIO);                                 

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建温度任务</span>
    OSTaskCreate(ds18b20_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    (OS_STK*)&DS18B20_TASK_STK[DS18B20_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],DS18B20_TASK_PRIO); 

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建光敏检测任务</span>
    OSTaskCreate(telesky_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    (OS_STK*)&TELESKY_TASK_STK[TELESKY_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],TELESKY_TASK_PRIO); 

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建烟雾检测任务</span>
    OSTaskCreate(mq_2_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    (OS_STK*)&MQ_2_TASK_STK[MQ_2_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],MQ_2_TASK_PRIO); 

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建串口3任务,用来进行和上位机通讯</span>
    OSTaskCreate(uart3_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    (OS_STK*)&UART3_TASK_STK[UART3_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],UART3_TASK_PRIO); 

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建蜂鸣器任务</span>
    OSTaskCreate(beep_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
    (OS_STK*)&BEEP_TASK_STK[BEEP_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],BEEP_TASK_PRIO);

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//按键扫描任务</span>
     OSTaskCreate(key_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
     (OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],KEY_TASK_PRIO);

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建步进电机任务</span>
     OSTaskCreate(step_motor_task,(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *)<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,
     (OS_STK*)&STEP_MOTOR_TASK_STK[STEP_MOTOR_STK_SIZE-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],STEP_MOTOR_TASK_PRIO);

    OSTaskSuspend(START_TASK_PRIO); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//挂起起始任务.</span>
    OS_EXIT_CRITICAL();             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//退出临界区(可以被中断打断)</span>
}     </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li></ul>

可以很清楚的看到,开始任务里边创建了多个任务,接着,各个任务创建成功后边会挂起任务,退出临界区,开始各个任务的轮训操作。

上面各个任务创建时,都指定了任务优先级,堆栈大小等信息。在app.h文件中可以看到:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//开始任务</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> START_TASK_PRIO                                         10     //开始任务的优先级设置为最低</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> START_STK_SIZE                                              64     //设置任务堆栈大小</span>
OS_STK START_TASK_STK[START_STK_SIZE];                      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建任务堆栈空间  </span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> start_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);                               <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//任务函数接口</span>

 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建步进电机任务</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> STEP_MOTOR_TASK_PRIO                        11</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> STEP_MOTOR_STK_SIZE                         64</span>
OS_STK STEP_MOTOR_TASK_STK[STEP_MOTOR_STK_SIZE];
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> step_motor_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// //按键扫描任务</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// #define KEY_TASK_PRIO  10     设置任务优先级</span>
 <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> KEY_STK_SIZE  90      //设置任务堆栈大小</span>
OS_STK KEY_TASK_STK[KEY_STK_SIZE];                          <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建任务堆栈空间  </span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> key_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);                                 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//任务函数接口</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//蜂鸣器任务--根据各个传感器数据,进行报警</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> BEEP_TASK_PRIO                                                          9</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> BEEP_STK_SIZE                                                               64</span>
OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> beep_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);


<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// //人体感应模块 任务</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> HC_SR501_TASK_PRIO                                      8 </span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> HC_SR501_STK_SIZE                                       64</span>
OS_STK HC_SR501_TASK_STK[HC_SR501_STK_SIZE];
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> hc_sr501_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);


<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//光敏传感器采集任务</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> TELESKY_TASK_PRIO                                        7       //设置任务优先级</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> TELESKY_STK_SIZE                                             64      //设置任务堆栈大小</span>
OS_STK TELESKY_TASK_STK[TELESKY_STK_SIZE];                  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建任务堆栈空间  </span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> telesky_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);                             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//任务函数接口</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//DHT11任务(温湿度传感器)</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> DHT11_TASK_PRIO                                  6       //设置任务优先级</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> DHT11_STK_SIZE                                       64      //设置任务堆栈大小</span>
OS_STK DHT11_TASK_STK[DHT11_STK_SIZE];                      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建任务堆栈空间  </span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> dht11_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);                               <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//任务函数接口</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//MQ-2任务(烟雾传感器)</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> MQ_2_TASK_PRIO                                      5       //设置任务优先级</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> MQ_2_STK_SIZE                                   90      //设置任务堆栈大小</span>
OS_STK MQ_2_TASK_STK[MQ_2_STK_SIZE];                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建任务堆栈空间  </span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> mq_2_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);                                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//任务函数接口</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//DS18B20任务</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> DS18B20_TASK_PRIO                            4</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> DS18B20_STK_SIZE                             64</span>
OS_STK DS18B20_TASK_STK[DS18B20_STK_SIZE];
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> ds18b20_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//串口发送数据任务(用来想上位机 实时 传输输出)</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> UART3_TASK_PRIO                             3</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#<span class="hljs-keyword" style="box-sizing: border-box;">define</span> UART3_STK_SIZE                              90</span>
OS_STK UART3_TASK_STK[UART3_STK_SIZE];      
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> uart3_task(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> *pdata);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li></ul>

任务的优先级决定了任务在被打断时执行的顺序,优先级越高,越有优先权。


串口数据的读取

在单片机开发过程中串口的操作可以算是最普通也是最基础的操作了,好多东西都是需要通过串口进行输出,这样可以对程序执行过程中的一些中间数据进行输出。这里主要说说串口数据的读取。

数据的读取使用中断的方式进行交互,这样效率很高。这里执行看核心代码即可:

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> recv_zigbee_msg(u8 Res)
{
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Res == END_RESD_MSG)
    {
        FLAG_ZIGBEE_RECV_BEGIN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        USART3_RX_BUF[USART3_RX_STA++&<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0X3FFF</span>] = Res;
        cpynbyte2buffer(USART3_RX_BUF, USART3_RX_STA);
        USART3_RX_STA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memset</span>(USART3_RX_BUF, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(USART3_RX_BUF));
    }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(Res == BGN_RESD_MSG || FLAG_ZIGBEE_RECV_BEGIN)
    { 
        FLAG_ZIGBEE_RECV_BEGIN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
        USART3_RX_BUF[USART3_RX_STA++&<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0X3FFF</span>] = Res;
    }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
     {
        FLAG_ZIGBEE_RECV_BEGIN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        USART3_RX_STA = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memset</span>(USART3_RX_BUF, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(USART3_RX_BUF));
     }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li></ul>

这里接收数据时对帧头进行了一个简单的判断,正确后接着接收,碰到帧尾后将数据拷贝到了一个缓冲区中,然后清空接收缓冲。整个过程就这么简单。


数据的打包和解析操作

数据解析

前一部分介绍了数据的接收,这里再说说对数据的解析。从上面的代码中可以看出来有个函数:cpynbyte2buffer(),该函数是吸纳对数据的解析操作,如下所示:

<code class="hljs haskell has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-title" style="box-sizing: border-box;">void</span> cpynbyte2buffer(u8 *<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>, u8 len)</span>
{
    int i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
    u8 data_postion = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;

    protocol recvMsg;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">BGN_RESD_MSG</span> == <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[data_postion++])</span>
    {
        printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"begin\r\n"</span>);
        recvMsg.potocol_len = <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[data_postion++];</span>
        recvMsg.device = <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[data_postion++];</span>
        recvMsg.device_cmd = <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[data_postion++];</span>
        recvMsg.data_len = <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[data_postion++];</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (recvMsg.data_len > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)
        {
            recvMsg.<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span> = <span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-title" style="box-sizing: border-box;">u8</span> *)</span>malloc<span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-title" style="box-sizing: border-box;">sizeof</span>(<span class="hljs-title" style="box-sizing: border-box;">u8</span>)</span>*recvMsg.data_len);</span>
            for (i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;i < recvMsg.data_len ;i++)
                {
                    recvMsg.<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[i] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[data_postion++];</span>
                }
        }

        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>[data_postion] == <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">END_RESD_MSG</span>)</span>
        {
            printf(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"end\r\n"</span>);
            recv_data(&recvMsg);
        }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul>

在上面对数据结构体进行了赋值后便开始了整整的数据或者命令的执行,如 recv_data(protocol *protocol)所示:

<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">void recv_data(protocol *protocol)
{
   switch(protocol->device)
   {
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_BEEP:                  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_beep(protocol);                         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_BED_ROOM_LED_LEFT:     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_led(protocol);                          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>; 
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_BED_ROOM_LED_RIGHT:    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_led(protocol);                          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>; 
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_PARLOUR_LED_MAIN:      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_led(protocol);                          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_PARLOUR_LED_TOP:       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_led(protocol);                          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_PARLOUR_LED_HELP:      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_led(protocol);                          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_KITCHIN_LED:           <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_led(protocol);                          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             //<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_CURTAIN:               <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_curtain(protocol);                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_ALL_LED:                               <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_all_led(protocol);                      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
           //<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_LEAVE_HOME:                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_leave_home(protocol);               <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_GO_HOME:                               <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_go_home(protocol);                      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_SMOKE:                                 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_change_smoke_value(protocol);   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_DS18B20:                               <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_change_parlour_temp(protocol);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> MODULE_DHT11_HUM:                         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">exec</span>_module_change_parlour_hum(protocol);   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
             default:                                                                               <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul>
数据打包发送

数据发送任务函数:

<code class="hljs scss has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">    <span class="hljs-function" style="box-sizing: border-box;">pack_send_data(MODULE_DS18B20, PROTOCOL_FULL_DATA, DATA_SIZE,parlour_temp_data)</span>;    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//客厅温度</span>
    <span class="hljs-function" style="box-sizing: border-box;">delay_ms(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">400</span>)</span>;
    <span class="hljs-function" style="box-sizing: border-box;">pack_send_data(MODULE_DHT11_TEMP, PROTOCOL_FULL_DATA, DATA_SIZE, bed_tempture_data)</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//卧室温度</span>
    <span class="hljs-function" style="box-sizing: border-box;">delay_ms(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">400</span>)</span>;
    <span class="hljs-function" style="box-sizing: border-box;">pack_send_data(MODULE_DHT11_HUM,PROTOCOL_FULL_DATA,DATA_SIZE,humidity_data)</span>;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//客厅湿度</span>
    <span class="hljs-function" style="box-sizing: border-box;">delay_ms(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">400</span>)</span>;
    <span class="hljs-function" style="box-sizing: border-box;">pack_send_data(MODULE_SMOKE,PROTOCOL_FULL_DATA,DATA_SIZE,kitchen_smoke_data)</span>;       <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//厨房浓度值</span>
        <span class="hljs-function" style="box-sizing: border-box;">delay_ms(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">400</span>)</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

上面是数据发送任务里调用的发送函数,该函数中对各个传感器采集到的数据进行了打包并发送操作。可以看打包发送函数:

void pack_send_data(u8 drive, u8 drive_cmd, u8 data_len, u8 *data)

<code class="hljs rust has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*
  * @function   pack_send_data
  * @input
  * @output
  * @brief   通讯协议功能的实现.
  *          本文件实现了数据包的发送和接受,以及根据数据类型执行对应的函数
  */</span>
void pack_send_data(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">u8</span> drive, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">u8</span> drive_cmd, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">u8</span> data_len, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">u8</span> *data)
{
    protocol Msg;
    Msg.send_begin      = BGN_RESD_MSG;         <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//帧头 #</span>

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//若数据长度 > 0,即有数据</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(data_len > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)
    {   
        Msg.potocol_len = PROTOCOL_BASIC_SIZE + data_len - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
    }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
    {
        Msg.potocol_len = PROTOCOL_BASIC_SIZE;
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//填充数据结构体</span>
    Msg.device      = drive;
    Msg.device_cmd  = drive_cmd;
    Msg.data_len    = data_len;
    Msg.data        = data;
    Msg.send_end    = END_RESD_MSG;         <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//帧尾*</span>

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//发送数据</span>
    send_data(&Msg);
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul>

这里列出来核心代码,具体实现代码请看工程。打包发送函数中主要做了2件事情:一:对数据成员初始化,二:判断一帧数据的大小!数据大小值很重要的,这在数据解析过程可需要用到。

下面简单介绍下系统使用到的一些资料和系统实现的功能。 
开发系统:Windows10 64位 
Ubuntu 14.04 32 位 
软件版本:Qt 4.8.6 
IAR .0 
Altium Designer 13.0 
工具链:arm-linux-gcc 4.4.3

系统实现的主要功能如下所示: 
1. STM32下位机 
(1) 应用了小型的嵌入式操作系统μC/OS-II; 
(2) 各个传感器的数据以多任务的形式获取,实时性很好; 
(3) 数据调试使用STM32串口1; 
(4) 数据的发送使用STM32的串口3,并以任务的形式进行打包发送,具体数据帧格式请看代码; 
(5) STM32接收数据采用终端方式,当有数据到来时会触发终端,进入数据接收解析过程,在此过程中会对数据的帧头等信息进行判断; 
2. Zigbee无线通信 
Zigbee部分其实没有太多功能,一句话概括就是一个串口透传功能!本来当初计划直接使用zigbee驱动各个传感器,然后组网后发送给协调器,考虑到既然学习了STM32,就利用上吧!其实这里完全可以直接使用zigbee,不使用STM32的。 
两套方案的编码工作其实早就已经完成了,思考了好久才决定采用STM32+zigbee方式,这样下来可以学到很多,尤其是μC/OS-II系统的移植,还是很深奥的,很值的以后继续深入的去学习。 
3. ARM上位机 
ARM上位机采用友善支臂的SMART210开发板,自己后续移植了Qt4.8。上位机主要实现了一下几个功能: 
(1) 模拟室内三个场景:卧室、客厅、厨房 
(2) 分别对这个三个场景下的温度,湿度以及烟雾浓度进行一个测量并显示; 
(3) 使用LED灯模拟室内照明灯; 
(4) 使用人体红外传感器进行检测是否有人(这个传感器有点不靠谱,最后取消了) 
(5) 当初计划添加视频监控,到了后期发现工作量太大,没有时间做了,所以就没有完成,这点以后会添加上去的。 
(6) 代码中使用了“liudianwu”分享的一些api,由于时间紧,所以直接拿来用了,在此感谢! 
(7) 代码重复率有点高,好几处的button样式是相同的,完全可以提取出来,在此请大家海涵。

资源说明

资源中主要包含了一下部分内容,各位可以先看下,是否是自己需要的。 
这里写图片描述

  1. 其他资料 
    其他资料中包含了Qt串口介绍,zigbee无线通信介绍以及STM32常见的API介绍。
  2. 硬件相关 
    硬件相关中包含了STM32PCB的设计原理图,PCB图暂时么有!
  3. 源码 
    源码中包含了本系统最终的3部分代码。(完整代码)

这里写图片描述

这是实际大小,请下载解压后核对。

资料下载地址

上位机界面源码地址: 
http://download.csdn.net/detail/u013704336/9490337

全部资料地址: 
http://download.csdn.net/detail/u013704336/9560355


如果你觉得还可以,请给个赞给与支持,谢谢。 






  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
內容都是蒐尋自網路的短篇資料,因為即使壓縮後,檔案仍舊大於20M,所以只好分成2個獨立的壓縮檔. 此壓縮檔內容為: 基於ARM9的嵌入式Zigbee網關設計與實現 基於CC2430片內溫度傳感器溫度檢測系統的設計 基於EPA控制網絡的ZigBee無線接入研究與實現 基於IEEE802.11MAC協議的性能分析與仿真 基於TinyOS的嵌入式無線傳感器網絡設計 基於wsn的井下巷道瓦斯監測系統設計 基於Zigbee 技術的智能家居系統設計 基於ZigBee 技術的路燈無線網絡控制系統設計 基於ZigBee技術的空調控制系統 基於ZigBee技術的智能交通網絡研究 基於ZigBee技術的智能樓字自動化系統設計 基於Zigbee技術的無線傳感網絡拓撲設計與實現 基於ZigBee技術的煤礦瓦斯監測系統 基於ZigBee技術的養老院無線緊急呼叫系統 基於ZigBee技術的糧庫監測系統設計 基於Zigbee技術的醫院患者監控系統研究 基於ZigBee和GPRS的遠程監控系統設計 基於Zigbee和傳感器的可穿戴性網絡在智能家居網絡中的應用 基於Zigbee的井下長距離無線通訊系統 基於ZigBee的公交自動報站系統的設計 基於Zigbee的文件傳輸技術 基於ZigBee的信息家電遠程監控方案設計 基於ZigBee的無線傳感器網絡設計方案 基於ZigBee無線傳感器網絡的脈搏信號測試系統 基於zigbee與GPRS的無線水文監測系統設計 基於射頻芯片的ZigBee無線傳感器網絡節點的設計 基於無線傳感器的微控制器SPI總線設計 基於無線傳感器網絡技術的煤礦安全監測系統 基於無線傳感器網絡系統的煤巷圍岩動態監測 基於無線傳感器網絡的水污染監測系統 基於無線傳感器網絡的空氣質量檢測系統 基於無線傳感器網絡的環境溫度濕度監測系統 無線定位方案 無線傳感器網絡 無線傳感器網絡03 無線傳感器網絡在智能建築中的應用 無線傳感器網絡定位技術研究 無線傳感器網絡定位技術應用 無線傳感器網絡節點的研究與設計 無線傳感器網絡路由協議與改進 與蜂共舞——ZigBee技術一瞥 礦山工程技術其他學科

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值