基于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. 日志回滚:python(日志分割)

    日志回滚:python 什么是日志回滚? 答: 将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能.因此,有必要对日志文件按某种条件进行切分,要切分日 ...

  2. vc++ 在程序中运行另一个程序的方法

    在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec,ShellExecute ,Creat ...

  3. Android对Sqlite数据库的增删改查

    SqLite 数据库 Google 为我们提供了sqlite相关的api SqLiteOpenHelper 这是一个抽象的类 如果想要使用的话,需要其他的类去继承他 SqLiteDatabase 类 ...

  4. luogu P4779 【模板】单源最短路径(标准版)

    线段树优化dij 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 我可能是个智障 // luogu-judger-enable-o2 #pragma GCC diagnostic error "-std= ...

  5. 垂直居中Demo

    换行文字垂直居中1 换行文字垂直居中,兼容所有浏览器 换行文字垂直居中2 换行文字垂直居中,兼容所有浏览器 固定宽高图片垂直居中1 固定宽高图片垂直居中2 图片自适应容器宽高垂直居中 CSS3垂直居中 ...

  6. QThreadPool线程池的开发使用

    QThreadPool+QRunnable线程池与QThread线程两种方式使用的场景不同,QThreadPool+QRunnable线程池主要用于那种不需要一直运行的任务,而QThread主要用于长 ...

  7. android防止按钮连续点击方案之AOP

    转载请标明出处http://www.cnblogs.com/yxx123/p/6675567.html 防止连续点击的实现方式有很多种,比如,在所有的onclick里面加上防多次点击的代码,或者定义一 ...

  8. 设置java.library.path的值(Mac/Linux/Windows)

    说明:网上基本针对这个值的设置分为两面,Windows派和Linux派,Windows的不说,Linux下只会说设置LD_LIBRARY_PATH即可,但这种方式在Java 8是一个错误的设置,尤其是 ...

  9. 強大的jQuery Chart组件-Highcharts

    Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: 对个人用户完全免费: 纯JS,无BS: 支持大部分的图 ...

  10. Android中pm命令用法(转)

    usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list perm ...