基于LabVIEW的智能家居报警系统(多线程、队列)

    昨天晚上,帮师弟用LabVIEW做了一个智能家居报警系统的上位机软件,挺好玩的,虽然功能不多、结构也简单,但是,所用到的技术对于学习LabVIEW的人来说很重要。

    首先,贴出前面板的图片来。单片机向上位机发送的帧格式为:0x0A+3字节的温度数据+0x0B+4字节的烟雾浓度数据+0x0C+1字节的开关门信号(总共11个字节),发送的波特率为9600,发送周期为200ms。上位机采集软件每隔10ms(就是前面板上的队列循环周期)从串口缓存区里读取11个字节的数据,然后将其进行解析和显示。

图1 软件的前面板截图

然后,再把程序框图一一给大家亮出来。

 图2 串口配置和串口收/发的程序图

    如图2所示,VISA每隔10ms从串口缓存区读取11个字节的数据,然后将数据送入串口接收数据队列中。这里采用的是生产者-消费者模型的循环结构,读串口采用的是生产者循环结构,解析数据采用的是消费者循环结构。

图3 数据解析和数据显示部分的程序图

    如图3所示,消费者循环用于解析数据,根据0x0A、0x0B、0x0C三个属性字节分别对温度值、烟雾浓度值以及开关门信号进行解析和显示,波形显示采用的是波形图表,温度值可通过温度计显示,烟雾浓度可通过指针式仪表盘显示,显示效果直观、大方。

图4 声音报警部分的程序图

    如图4所示是声音报警部分的程序图,上半部分是温度报警程序,报警声音持续时间为2秒钟,报警声频率为3KHz;下半部分是烟雾浓度报警程序,报警声音持续时间为1秒钟,报警声频率为1KHz。由于声音报警持续的时间为1~2秒钟,如果将报警程序放在解析数据的那个大循环里,则会导致大循环的执行被延迟1~2秒钟,因此,必须将报警程序提出来单独写,从而使之变成了两个独立运行的线程。

    以上就是对本软件的介绍,本软件依然存在一些小BUG,比如说:有时候第一次启动这个软件后,串口读到的数据帧并不是0x0A+3字节的温度数据+0x0B+4字节的烟雾浓度数据+0x0C+1字节的开关门信号,通过探针我看到的是1字节的开关门信号+0x0A+3字节的温度数据+0x0B+4字节的烟雾浓度数据+0x0C,开关门信号跑到帧首去了,出现了断帧的现象。这个结果是由设置串口每次读取11个字节引起的,当串口缓存区里的字节数大于11时就会出现这种结局,因此,需要在开启软件之后对串口缓存区进行清除操作,并且要求读串口的速率大于单片机发送数据的速率。

posted @ 2016-07-08 10:13  cn三爷  阅读(2060)  评论(1编辑  收藏  举报