APP下载

基于Android平台串口驱动的多传感器数据传输的实现

2017-05-17崔世钢代凤辉梁帆

江苏农业科学 2016年1期
关键词:Android系统智能控制

崔世钢 代凤辉 梁帆

摘要:为了实现将植物生长柜传感器节点的信息传输到Android系统下,同时在该系统下实现对各传感器节点的数据显示和控制。本研究在对Android平台串口驱动进行重点分析的基础上,设计并实现多传感器(包括2个温度传感器、1个湿度传感器、1个光照传感器、1个二氧化碳浓度传感器)的数据传输和实时显示。Android平台具有强大的功能,将多传感器数据传输到该平台下,为后续开发提供广阔空间。

关键词:智能植物生长柜;Android系统;智能控制;串口驱动;多传感器;

中图分类号:TP274;S126 文献标志码:A 文章编号:1002—1302(2016)01—0403—03

当前,世界人口不断增长、物质需求不断增加,而资源却不断减少,环境不断恶化,为解决全球资源与环境问题,设施农业越来越受到人们的推崇,得到了前所未有的发展与应用。智能植物生长柜作为设施农业的一部分,以节省资源、环境保护、安全、放心、健康为出发点,得到社会的广泛关注与认可。随着城市的现代化建设步伐和环境污染速度越来越快,可利用农业耕地面积越来越少,同时人们生活水平的提高,对生活质量也提出了更高的要求。作为一种保护环境、节约资源和能生产出安全健康的新型植物生产系统,智能植物生长柜有很强的应用性。在我国,对于农业生产环境的监控基本處于人工采样、化学分析的人工监测阶段,实时性不好,少数便携式仪表还存在使用维护困难等问题,此外生长柜对环境具有非常高的要求。Android系统作为开源的操作系统、操作简单、功能强大,基于该平台下的各类控制系统很多大学与公司的研究方向。Android设备驱动程序是Android操作系统的重要组成部分,是软件与硬件连接的“桥梁”,分析该系统下的设备驱动运行机理,对于Android系统上层应用程序的设计开发有重大的指导意义。

1材料与方法

1.1系统方案

系统主要分为执行模块、生长柜监控模块、Android测控端等部分。本研究对Android系统内核中的串口驱动程序进行了详细的分析,并在此基础上编写了应用程序,实现多传感器的数据传输。试验利用FS_V210开发板(运行Android系统)为终端,由下位机STM32实现对5个传感器数据的采集,通过其串口与运行Android系统的上位机进行通信,在开发板显示屏上实时显示5个传感器数据。FS_V210开发板具有摄像头、LCD触摸屏、网口等丰富硬件资源,便于携带、交互性强、易于开发,为智能植物生长柜提供优秀的控制系统平台。Android系统结构框图如图1所示。

1.2实现方法

1.2.1 Android串口驱动开发 串口驱动的实现过程就是Android系统下的通信数据流和功能调用的过程。Android串口终端驱动结构如图2所示,串口驱动结构共分为4个层次,即驱动层、HAL层(1ibhardware)、JNI层(java native inter-face)、Framework层和应用层。

1.2.1.1串口驱动层 Android内核是由标准的Linux内核修改而来的,最底层的Android硬件驱动层就是Linux设备驱动层,二者内核驱动程序的编写方法是一样的,都是以Linux模块的方法实现的。驱动层是与硬件设备直接联系的一层,通过访问相应驱动程序直接对硬件进行操作,在该层中定义串口设备文件的访问方法,主要定义串口的Open、Read和Write。此外,还执行了串口设备的注册和初始化操作。

1.2.1.2 HAL层 硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中,在该层中增加串口的硬件抽象层模块访问Linux内核驱动程序。按照An-droid硬件抽象层规范的要求,分别定义模块ID(UART_HARDWARE_MODULE_ID)、模块结构体(struct uart_module_t)以及硬件接口结构体(struct uart_control_device_t)。在硬件接口结构体中,fd表示设备文件描述符,HAL层结构如图3所示。

1.2.1.3 JNI层 Android系统的应用程序是用Java语言编写的,而硬件驱动程序是用c语言来实现的,应用程序要调用串口驱动程序操作硬件必须通过Java本地调用JNI来调用硬件抽象层接口。JNI层主要实现Java与C/C++之间的过渡,不涉及复杂的逻辑,只根据规则为上层函数调用串口的下层接口。该层定义HAL的模块ID和2个全局变量sUartDe-vice和sUartModule,在Uart_init函数中,通过Android硬件抽象层提供的hw_get_module方法来加载模块ID为UART_HARDWARE_MODULE_ID的硬件抽象层模块,其中HELLO_HARDWARE_MODULE_ID是在中定义的。Android硬件抽象层会根据UART_HARDWARE_MOD-ULE_ID的值在Android系统的/system/lib/hw目录中找到相应的模块,然后加载起来,并且返回hw_module_t接口给调用者使用。

1.2.1.4 Framework层 为硬件抽象层模块编写完串口的JNI方法后,须要为Android系统的Application Frameworks层增加硬件访问服务MyUartService,通过该层提供的硬件服务来调用JNI方法,进而调用底层的硬件抽象层接口去访问硬件。在Application Frameworks层中包含自定义的硬件服务MyUartService,在Android系统启动时自动加载MyUartSer-vice。这时应用程序就可以通过Java接口来访问uart硬件服务了。

1.2.2串口应用程序的开发 本研究中实现的功能是由单片机STM32实现对2个温度传感器(为区分2个温度传感器的值,显示分别命名为根部温度、温度)、1个湿度传感器、1个光照强度传感器、1个CO2浓度传感器数据的采集,通过其串口将接收到的5个传感器数据在开发板上实时显示。底层编写的串口驱动程序,实现的功能是1个字节的读和字符串的写,在应用程序层调用字符型函数GpsDataUpdate()实现1个字节的读取,整型函数GpsDataUpdate_write(string s)实现字符串的写。为实现各个传感器数据的正确显示,须要在上层对串口应用程序进行开发。程序设计流程图如图4所示。

开发的关键技术和部分代码如下:(1)在Android系统应用程序开发软件eclipse中新建工程,然后在该工程新建Uart类,这个类主要用来加载SO文件(uart_runtime.so),通过JNI的方式打开关闭串口。

(2)为实现通过串口接收到的所有数据的显示,定义1个字符串s1,用于存放通过GpsDataUpdate()读取到的1个字节(以下代码是把该字节先读取到sbuffer,再由sbuffer存放于s1辛),在这里有1个while循环用于判断是否数据接收完,未接收完就继续接收,并把接收到的值放到s1,接收完就跳出。在区里加1个线程将接收到的数据实时显示,睡眠时间为1 s。

(3)实现以上代码的功能,可以读到5个传感器的数据,但是须要将5个传感器的数据分开,分别显示在5个EditText中。利用split根据给定的参数把原来的分割为几个子字符串。核心代码如下:

在本例中,下位机STM32串口发送的1串数据中开头与结尾分别加上字母b,中间的每个传感器数据之间都加上字母a。以上代码strView.split(“b”)中,将字符串strView根据参数b分割为3个部分,取中间的传感器数据部分,再根据参数a进行分割,可以准确得到5组数据,分别存放于字符串strView0、strViewl等5个字符串中。updateView()为刷新函数,数据不断更新。

2结果与分析

本例中使用Android第3方图形库AndroidPlot绘制图形,先创建1个数组保存绘制用的数据,然后将数组转换为XYSeries,将数组中的传感器值绘制在图形库中,生成曲线图。试验结果以植物生长柜的空气温度为例,如图5所示。

3结论

本研究通过对Android系统下的串口驱动原理的具体实现方法进行详细分析的状态下,实现FS_V210开发板与单片机STM32的串口通信,完成对智能植物生长柜中各个传感器节点信息的接收与显示,为实现生长柜的智能化、网络化打下基础。设计实例,开发Android系统的串口应用程序,接收到5个传感器数据,对串口驱动程序进行验证分析,对智能植物生长柜在Android系统下的开发具有指导意义。

猜你喜欢

Android系统智能控制
Android系统上的移动互联网集成平台开发机制
基于物联网的智能控制项目实践教学设计
应用型人才培养导向下智能控制教学改革探讨
浅谈开关式电梯IC卡系统及展望