基于ZigBee和STM32的智能家居控制系统的设计与实现(三)

自从前两篇博客介绍了智能家居系统的基本实现机理后,收到了好多朋友的来信,和我讨论了好多的这方面的知识,在此很高兴,虽然自己做的这个所谓的智能家居看着挺高大上的,其实没有什么了,在内行人眼里都是小儿科。所以如果你是高手,请绕步。对于想要学习这方面知识的小伙伴来说还是有其价值的。


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

界面的实现

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


最终版本的界面如下图所示:

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

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

    tbn->setAutoRaise(true);
//设置文本在图标下边
tbn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  • 1
  • 2
  • 3

界面中的其他图标设置样式都是类似的,只不过是大小策略的不同而已,关于界面实现的细节,通过修改样式表完全可以解决,样式表我就不做过多的介绍,因为官方的文档介绍的太详细了。
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()函数对接收到的数据进行判断,小于某个数就返回再读取,否则收到的数据不完整。


技术在于交流、分享……
Email:kevinlq0912@163.com
QQ:936563422

基于ZigBee和STM32的智能家居控制系统的设计与实现(三)的更多相关文章

  1. 基于ZigBee的家居控制系统的设计与应用

    基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...

  2. 毕业设计——基于ZigBee的智能窗户控制系统的设计与实现

    题目:基于物联网的智能窗户控制系统的设计与实现 应用场景:突降大雨,家里没有关窗而进水:家中燃气泄漏,不能及时通风,威胁人身安全,存在火灾的隐患:家中窗户没关,让坏人有机可乘.长时间呆在人多.封闭的空 ...

  3. 基于ESP32的智能家居管理系统的设计与实现

    基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...

  4. emWin智能家居主界面设计,含uCOS-III和FreeRTOS两个版本

    第6期:智能家居主界面设计配套例子:V6-910_STemWin提高篇实验_智能家居主界面设计(uCOS-III)V6-911_STemWin提高篇实验_智能家居主界面设计(FreeRTOS) 例程下 ...

  5. 迅为4412开发平台Zigbee模块在物联网智能家居中的应用

      物联网智能家居的发展物联网随着互联网的发展,可以通过互联网实现物和物的互联,就有了物联网的概念.传统家居电器 有了物联网之后,在家居电器范围中,就是通过物联网技术将家中的各种设备连接到一起,家居中 ...

  6. Beaglebone Black – 智能家居控制系统 LAS - 插座组装

    上一篇完成了服务端,这次是拼图的最后一块,插座. 插座一个,准备废掉它其中一个插头 预想电路草图 物料清单: 两路插座一个 继电器一个,3.3V 能驱动即可: 交流转直流 3.3V,我买了现成的模块: ...

  7. Beaglebone Black– 智能家居控制系统 LAS - 网页服务器 Node.js 、Web Service、页面 和 TCP 请求转 UDP 发送

    上一篇,纯粹玩 ESP8266,写入了 init.lua 能收发 UDP.这次拿 BBB 开刀,用 BBB host 一个 web server ,用于与用户交互,数据来自 ESP8266 的 UDP ...

  8. BeagleBone Black– 智能家居控制系统 LAS - ESP8266 UDP 服务

    NodeMCU 的文档里面终于发现,ESP8266 的GPIO 2 确实是 PIN 4,GPIO 0 是 PIN 3. https://github.com/nodemcu/nodemcu-firmw ...

  9. Beaglebone Black– 智能家居控制系统 LAS - 刷 WiFi 模块 ESP8266 Firmware 和 ESP8266 直接收发 GPIO 信号

    用 Windows 来刷 ESP8266 固件有很多中文教程,来试试直接用 BBB 刷吧.目标是 NodeMCU,ESP-01 可用,就是我买的那个. 接线方式在上一篇.当 echo ‘BB-UART ...

随机推荐

  1. 在VC++中怎样改变控件间的TAB切换顺序?

    在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.

  2. 使用HttpServlet简单实例

    使用HttpServlet简单实例 package com.kettas.servlet ; import javax.servlet.* ; import javax.servlet.http.* ...

  3. Javascript实现一个插件

    写一个插件,兼容commonjs,amd,cmd,原生js. ;(function (global, factory) { if(typeof define == 'function' &&a ...

  4. markdown编辑器使用指南

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...

  5. 使用gtest对DLL工程进行单元测试的实践

    前言 关于单元测试的重要性.gtest的优缺点等就不说了.之前项目是没有做单元测试的,在VS的解决方案中,只有一个可执行的工程,其他的工程都是以DLL库的形式提供.本文只针对使用VS对DLL库进行单元 ...

  6. js 弹窗广告24小时显示一次

    弹窗24小时显示一次 https://www.w3cschool.cn/javascript/js-cookies.html 我们需要借助cookie来实现这个功能 function setcooki ...

  7. 使用chrome控制台作为日志查看器

    很多时候,我们需要查看日志的实时输出,这个时候往往只能选择控制台.我这里的日志框架是serilog,它有一个好处是控制台输出时可以高亮的形式显示其参数结构信息,如下图所示 但也存在许多不方便的地方: ...

  8. HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. 《Go语言实战》摘录:6.5 并发 - 通道

    6.5 通道

  10. Android内存机制分析——堆和栈

    昨天用Gallery做了一个图片浏览选择开机画面的功能,当我加载的图片多了就出现OOM问题.以前也出现过这个问题,那时候并没有深究.这次打算好好分析一下Android的内存机制. 因为我以前是做VC+ ...