




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Android的智能家居三个火枪手2013年5月
目录TOC\o"1-3"\h\z第1章 项目概述 11.1 项目背景 11.2 术语定义 2第2章 技术方案 32.1 系统描述 32.2 功能描述 32.3 项目功能图 42.4 所涉及的系统、工具 4第3章 前端数据中心(A8)总体设计 53.1 程序设计流程图 53.2 线程定义 53.3 所用类定义 6第4章 前端A8模块设计 74.1 A8-AndroidApplication层设计 74.1.1 数据流分析 74.1.2 Application层详细设计与实现 94.2 A8-数据传递架构模块 164.2.1 层次接口表 164.2.2 HAL层 174.2.3 JNI层 194.2.4 Framework层 204.2.5 整体流程 214.2.6 关键代码分析 224.3 传输协议模块设计 324.3.1 A8接收数据格式 324.3.2 M0接收命令数据结构 33第5章 终端M0模块设计 355.1 终端设备方案描述 355.2 终端设备工作流程 355.3 功能模块描述 365.3.1 温湿度传感器DHT10 365.3.2 ZigBee通信部分 375.3.3 RFID读卡模块 405.3.4 IIC接口部分 41第6章 系统测试 456.1 项目演示 45项目概述项目背景随着社会电子信息化的不断发展,人们在家居中使用的电器越来越多,由此带来的安全隐患也有了明显的增多。在这些电器中一旦出现一些异常,便会给人们带来很大的损失。为了降低电器的不合理使用带来的异常情况,就要求在异常发生时用户能及时得到信息,并通过实时监控采取一定的操作排除异常。因此,远程监控系统的作用是非常巨大的。90年代末,随着多媒体技术、视频压缩编码技术、网络通讯技术的发展,数字视频监控系统迅速崛起,现今市场上由两种数字视频监控系统类型,一种是以数字录像设备为核心的视频监控系统,另一种是以嵌入式视频web服务器为核心的视频监控系统。以数字录像设备为核心的视频监控系统采用PC机作为多媒体监控主机,综合了视频矩阵、图像分割器、录像机等众多的功能,使系统结构大为简化,采用计算机网络技术,数字多媒体远程网络监控不受距离限制,采用大容量磁盘阵列存盘器或光盘存储器,可以节省大量的磁盘介质,同时有利于系统实现多媒体信息查询。但随着基于PC机的视频监控录像系统的发展,在实际使用过程中,也暴露出一些不足,主要是系统工作的不稳定性。以嵌入式视频web服务器为核心的视频监控系统,采用嵌入式实时多任务操作系统。摄像头采集到的图片信息经过压缩,通过内部总线送到内置的web服务器,网络上的用户可以直接用浏览器观看web服务器上的由摄像头采集的图像。由于把图片采集和web功能集中到一个体积很小的设备内,可以直接连入局域网,用户无需安装任何硬件设备,仅用浏览器即可观看。同时还具有以下优点:布控区域广阔,嵌入式视频web服务器监控系统web服务器直接连入网络,没有线缆长度和信号衰减的限制,同时网络是没有距离概念的,彻底抛弃了地域的概念,扩展布控的区域。系统具有几乎无限的无缝扩展能力。所以设备都以IP地址进行标示,增加设备只是意味着IP地址的扩充。性能稳定可靠,无需专人管理。嵌入式web服务器实际上是基于嵌入式微处理器技术,采用嵌入式实时多任务操作系统,对于用户来讲,上网进行登陆,便可对家中情况进行监控。除了WEB服务器实时控制之外,当前智能手机的发展趋势已经愈加明显。智能手机(Smartphone),是指“像个人电脑一样,具有独立的操作系统,可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来不断对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接入的这样一类手机的总称”。而当前应用在智能手机上的操作系统中Android操作系统占有相当大的比例。Android(中文名:安卓)是基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。随着Android应用的更见广泛,了解并能使用Android来完成我们对智能家居的控制已经显得愈加重要。现在监控系统发展到第三代,前端一体化、视频十字化、监控网络化、系统集成化成为视频监控系统公认的发展方向,它以网络为依托,以数字视频的压缩、传输、存放和播放为核心,以智能实用的图像分析为特点,并为报警系统、门禁系统完美的整合到一个使用平台上,引发了视频控制行业的一次技术革命。术语定义Android:Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。HAL:硬件抽象层。JNI:JNI是JavaNativeInterface的缩写,中文为JAVA本地调用。RFID:射频识别即RFID(RadioFrequencyIDentification)技术,又称电子标签、无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。A8:ARMCortex-A8处理器是第一款基于ARMv7架构的应用处理器,并且是有史以来ARM开发的性能最高、最具功率效率的处理器。M0:Cortex-M0处理器,是市场上现有的最小、能耗最低、最节能的ARM处理器。技术方案系统描述Android是一个开放源码的操作系统专门为移动电话而设计的系统。Android手机将开辟新的应用,使家居智能化运用于普通家庭。Android界面显示(Cortex_A8)来自于Cortex_m0模拟量,并可对Cortex_m0进行控制或操作。本系统做为裁减项目,实现了M0采集房间信息,通过无线方式发送到A8进行监控、控制。A8即可作为移动终端设备(如phone、pad等),亦可作中央监控服务器设备。本项目采用后者方案,即作中央监控。若需作移动设备,只需将程序移植到移动设备上,再在中央端移植web服务器,移动设备登陆服务器即可查看房屋信息。功能描述1.检测室内温度、湿度、光感、电压情况(通过Cortex_m0采集的信息)。2.通过温度、湿度的情况来对应调节风扇开关(控制Cortex_m0)。3.根据光敏传感器情况对应调节led灯亮灭(控制Cortex_m0)。4.根据三轴加速度情况对应调节蜂鸣器开关(控制Cortex_m0)。5.显示Rfid信息等功能(通过Cortex_m0采集)。项目功能图图2.1项目功能图所涉及的系统、工具表2.1系统与工具系统名称系统版本备注Linux内核Linux3.0.8Android文件系统Android4.0版本工具链arm-none-linux-gnueabi-gccAndroid程序开发Eclipse前端数据中心(A8)总体设计程序设计流程图图3.1程序设计流程图线程定义1.SmartHomeActivity,程序主Activity界面,打开程序首先运行。2.NodeInfoActivity,从界面Activity,用来显示详细设备采集信息和控制按键。3.MainReadThread,读数据主线程,该线程只负责对通过Zigbee获取的数据转发给读进程,不进行数据操作。4.MainHandlerThread,处理数据线程,该线程对从读进程传来的数据进行数据校验并转发。5.NodeWriteThread,控制线程,该线程负责处理由用户对设备的操作。所用类定义1.Data,用来存储和处理设备的采集数据。2.NodeCmd,定义操作方法,实现对设备的读操作和控制操作。3.NodeInfo,定义设备的所有采集信息,控制器状态和WatchDog。4.NodeList,使用链表存储设备信息。……??5.MyUartService:提供与底层的接口,以读写串口。前端A8模块设计A8-AndroidApplication层设计数据流分析NEWNODE,新节点加入1.数据处理流程图图4.1 NEWNODE数据流程图2.数据格式NEWNODE数据格式数据格式NEWNODES4FnI13.数据处理详细描述Cortex-M0开启,通过Zigbee发送NEWNODE数据给Cortex-A8,程序通过MainReadThread线程读取到数据,交由MainHandlerThread线程处理。MainHandlerThread对NOEWNODE进行校验,判断是否合法,如果数据无误,通过发送Handler消息交由SmartHomeActivity主界面UI线程,SmartHomeActivity判断链表是否已经存在该节点,不存在则加入链表并创建节点。…….?NODEINFO,节点信息更新。1.数据处理流程图图4.2 NODEINFO数据流程图2.数据格式NODEINFO数据数据格式NODEINFOS23FiI1T24H30L6V220X1Y1Z603.数据处理详细描述Cortex-M0开启,通过Zigbee发送NEWNODE数据给Cortex-A8,程序通过MainReadThread线程读取到数据,交由MainHandlerThread线程处理。MainHandlerThread对NODEINFO进行校验,判断是否合法,如果数据无误,通过发送Handler消息交由SmartHomeActivity主界面UI线程,SmartHomeActivity判断链表是否已经存在该节点,存在则更新该链表信息,并判断是否进入该节点从界面,如果进入发送Broadcast通知从界面更新数据。RFID,用户登录或退出。1.数据处理流程图图4.3 RFID数据流程图2.数据格式RFID数据格式数据格式RFIDS11FrI1R1031323.数据处理详细描述Cortex-M0开启,通过Zigbee发送NEWNODE数据给Cortex-A8,程序通过MainReadThread线程读取到数据,交由MainHandlerThread线程处理。MainHandlerThread对RFID进行校验,判断是否合法,如果数据无误,通过发送Handler消息交由SmartHomeActivity主界面UI线程,SmartHomeActivity发送Broadcast通知从界面,从界面判断是否为自己设备,是则更新数据。Application层详细设计与实现类对象详细描述1.Data类,负责对接受来数据进行处理表4.1Data成员属性表属性类型描述serialVersionUIDlong序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。dataString存储从串口的数据表4.2Data成员方法表方法参数返回值描述getDataSizeVoidString从传来的数据获取数据大小isValidDataVoidboolean数据有效性校验,包括数据是为为空,完整等getDataTypeVoidint从传来的数据获取数据类型getDataTargetVoidString从传来的数据获取数据的设备号getRfidVoidString从传来的数据获取Rfid信息getTemperatureVoidString从传来的数据获取温度getHumidityVoidString从传来的数据获取湿度getLightVoidString从传来的数据获取光感getAdVoidString传来的数据获取AD值getXVoidString从传来的数据获取三轴加速度x值getYVoidString从传来的数据获取三轴加速度y值getZVoidString从传来的数据获取三轴加速度z值2.NodeCmd类,负责与底层进行交互,实现对硬件设备读,写操作。表4.3NodeCmd成员属性表属性类型描述DevCmdenum使用枚举将命令声明一组命名的常数,方便函数调用。myUartServiceMyUartService串口操作所使用框架表4.4NodeCmd成员方法表方法参数返回值描述devControlint,DevCmdString向串口发送数据readNodeVoidString从串口获取数据3.NodeInfo类,负责存储一个设备的信息。表4.5NodeInfo成员属性表属性类型描述serialVersionUIDlong序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。temperatureString存储节点对象的温度值humidityString存储节点对象的湿度lightString存储节点对象的光感值xString存储节点对象的三轴加速度x值yString存储节点对象的三轴加速度y值zString存储节点对象的三轴加速度z值adString存储节点对象的ad值ledint存储节点对象的led灯状态(0,灭;1,亮)funint存储节点对象的风扇状态(0,关;1,开;2,加速)beepint存储节点对象的报警器状态(0,关;1,开)nixietubint存储节点对象的数码管状态(0,关;1,开)rfidrfid存储节点对象的rfid信息devNumint存储节点对象的设备号nextNodeInfo便于生成链表watchDogint看门狗,监控节点生命值表4.6NodeInfo成员方法表方法参数返回值描述NodeInfovoidvoid构造函数,初始化节点对象NodeInfovoidint有参数构造函数,参数为节点设备号getNextvoidNodeInfo获取下一个节点并返回节点信息setNextNodeInfovoidgetTemperaturevoidString获取该对象温度值setTemperatureStringvoid设置该对象温度值getHumidityvoidString获取该对象湿度值setHumidityStringvoid设置该对象湿度值getLightvoidString获取该对象光感值setLightStringvoid设置该对象光感值getAdvoidString获取该对象AD值setAdStringvoid设置该对象AD值getXvoidString获取该对象三轴加速度x值setXStringvoid设置该对象三轴加速度x值getYvoidString获取该对象三轴加速度y值setYStringvoid设置该对象三轴加速度y值getZvoidString获取该对象三轴加速度z值setZStringvoid设置该对象三轴加速度z值getLedvoidint获取该对象Led状态值setLedintvoid设置该对象Led状态值getFunvoidint获取该对象Fun状态值setFunintvoid设置该对象Fun状态值getBeepvoidint获取该对象Beep状态值setBeepintvoid设置该对象Beep状态值getNixietubvoidint获取该对象Nixietub状态值setNixietubintvoid设置该对象Nixietub状态值getDevNumvoidint获取该对象DevNum值setDevNumintvoid设置该对象DevNum值getRfidvoidString获取该对象Rfid值setRfidStringvoid设置该对象Rfid值getWatchDogvoidint获取该对象WatchDog值setWatchDogintvoid设置该对象WatchDog值ledOnvoidvoid开灯ledOffvoidvoid关灯funOnvoidvoid开风扇FunOn1voidvoid风扇加速funOffvoidvoid关风扇beepOnvoidvoid开蜂鸣器beepOffvoidvoid关蜂鸣器nixietubeOnvoidvoid开数码管nixietubeOffvoidvoid关数码管4.NodeList类,存储所有连接设备的信息,便于进行界面节点的更新,删除和添加操作。表4.7NodeList成员属性表属性类型描述headNodeInfo链表头结点lenLong链表长度表4.8NodeList成员方法表方法参数返回值描述getHeadNodeInfovoid获取链表头结点setHeadvoidNodeInfo设置链表头结点createNodeListvoidvoid创建设备节点链表insertNodeNodeInfovoid插入节点delNodeNodeInfovoid删除节点allNodevoidvoid遍历链表所有节点findByDevNumintNodeInfo通过设备号找到节点nodeIsNotExistedintboolean通过设备号查找节点是否存在于链表delByDevNumintvoid通过设备号删除节点allNodeSetWatchDogvoidString所有设备节点看门狗减一oneNodeFeedWatchDogintvoid通过设备号找到设备节点并喂狗findNodeDogDievoidint遍历设备节点,查看是否有节点生命结束getLenvoidint得到链表长度findNodeByPosintNodeInfo通过在链表中位置查找到设备节点线程类详细描述1.MainReadThread类当启动MainReadThread线程,执行run方法,run方法先通过running判断是否执行读操作,如果running为true,进行对设备读操作,判断MainHandlerThread处理线程是否创建,未创建则创建并将读出的数据传给MainHandlerThread,并启动线程,循环执行。图4.4MainReadThreadRUN流程图2.MainHandlerThread类当MainReadThread线程将读取的数据传到MainHandlerThread后,先对数据进行有效性认证,如果数据有误,使用handler传递发送给SmartHomeActivity即主界面UI线程,进行处理;如果数据无误,判断数据类型并使用handler传递,发送给SmartHomeActivity进行处理。图4.5MainHandlerThreadRUN流程图3.NodeWriteThread类只负责执行设备控制的命令,使用线程可以使程序多次独立线程执行,不被影响。图4.6NodeWriteThreadRUN流程图UI类详细描述1.SmartHomeActivity类onCreatea)初始化节点列表nodeList。b)设置从界面标题,setTitle。c)设置视图,setContentView。d)获取主界面控件的引用,findViewById。e)设置GridView和使用的适配器BaseAdapter。f)设置选项被单击的监听器,setOnItemClickListener。g)设置线程的Handler,重写handleMessage方法。h)打开程序读线程。i)注册返回广播接收器。onDestroya) 卸载广播接收器,unregisterReceiver。b) 关闭读线程,mainReadThread.stop。c) 关闭主界面Activity,this.finish。a) 设置所有节点的看门狗减一,allNodeSetWatchDog。b) 判断是否有节点看门狗死亡,findNodeDogDie。如果存在,删除Node节点链表,delByDevNum,并判断是否进入该节点从界面,如果进入则发送广播使其退出。最后,向该死亡设备发送确认命令ISEXIT,如果未死亡,重新发送添加节点NewNode的数据。……………….?c) 更新适配器notifyDataSetChanged。>>>>>>>>>>>>>>>>>>?(4) BackReceiver广播接受器a) 从节点列表删除从界面返回的节点的原对象,nodeList.delByDevNum()b) 向节点列表插入从界面返回的新节点对象,nodeList.insertNode()c) 关闭从界面Activity,finishActivity()。2.NodeInfoActivity类onCreatea) 创建从节点对象NodeInfo。b) 设置视图,setContentView。c) 获取从界面控件的引用,findViewById。d) 通过Intent对象,获取从主界面传来的nodeInfo对象并赋给从界面对象。e) 设置从界面标题,setTitle。f) 将主界面获取的nodeInfo对象反馈到界面,setText。g) 注册广播接收器h) 设置返回键监听器i) 设置风扇监听器,设置Led监听器,设置蜂鸣器监听器,设置数码管监听器(2) onDestroy卸载广播接收器,unregisterReceiver。数据库详细描述1.RfidRecordDBHelper类继承SQLiteOpenHelper类,重写onCreate方法。·表新建使用SQLiteDatabase对象的execSQL方法去添加表。命令如下:createtableifnotexistsrfidTable(idINTEGERprimarykeyautoincrement,devIdvarchar,rfIdvarchar)·增加使用SQLiteDatabase对象的execSQL方法去增加数据。命令如下:insertintorfidTable(devId,rfId)values(?,?)·删除使用SQLiteDatabase对象的execSQL方法去删除数据。命令如下:deletefromrfidTablewhererfId=?2.数据库表设计表4.9rfidTable数据库表字段名类型属性描述idINTEGERprimarykeyautoincrementID主键devIdVARCHARNull设备号rfIdVARCHARNullRFID号框架详细描述·MyUartService类1.加载库,System.loadLibrary("uart_runtime")2.重写构造函数,调用本地__init方法,对设备进行初始化。3.通过调用本地方法实现java方法A8-数据传递架构模块层次接口表数据传递(串口操作)应用层UartDataUpdateNewUartSendCmdUartDataUpdateNewUartSendCmdframework层_uart_send_cmd_uart_data_update_init_uart_send_cmd_uart_data_update_initJNI层Uart_writeUart_initUUart_writeUart_initUart_readHal层Uart_write_halUart_read_drvUart_device_openUart_read_halUart_write_drvUart_write_halUart_read_drvUart_device_openUart_read_halUart_write_drv驱动WriteOpenWriteOpenRead图4.6.1接口层次图图4.6.2结构图HAL层宏表4.10HAL层宏定义表名称内容功能UART_HARDWARE_MODULE_ID"uart"定义hal的模块idSTART0xAA数据包的开始符NEW0x01新节点加入发的包INFO0x02采集的信息包RFID0x04刷卡时发的包全局变量表4.11HAL层全局变量表名称类型功能fdint操作设备的文件描述符结构体表4.12HAL层结构体表structuart_module_t成员名类型功能commonstructhw_module_t记录本stub的基本信息和入口structuart_control_device_t成员名类型功能commonstructhw_device_t记录本stub操作设备时需要包括的接口uart_read_hal函数指针指向实际读串口的函数uart_write_hal函数指针指向实际写串口的函数4、流程图图4.7HAL层结构图JNI层宏表4.13JNI层宏定义表名称内容功能UART_HARDWARE_MODULE_ID"uart"定义HAL的模块ID全局变量表4.14JNI层全局变量表名称类型功能sUartDeviceuart_control_device_t*保存通过调用stub中的open接口后得到的deviceshandlesUartModuleuart_module_t*保存通过调用AndroidHAL标准函数hw_get_module,传入UART_HARDWARE_MODULE_ID后得到的UARTstub的句柄流程图JNI层主要实现了Java与c/c++之间的过渡,不涉及复杂的逻辑,只根据规则为上层函数调用相应的下层接口,参见整体流程。Framework层表4.15Framework层类表publicclassMyUartService方法功能System.loadLibrary装载编译好的JNI层的共享库publicMyUartService构造函数,打开并初始化串口publicStringUartDataUpdate读取当前串口信息数据包publicintUartSendCmd向串口传送命令数据包整体流程下续:hal层图4.8整体流程图关键代码分析NodeCmd.javastaticMyUartServicemyUartService=newMyUartService();//新建对象,初始化Strings=myUartService.UartDataUpdate();//更新采集数据myUartService.UartSendCmd(1,LED_ON);//点亮1号设备的灯MyUartService.javapackage.smarthome.uart;importandroid.util.Log;publicclassMyUartService{ /* *loadnativeservice. */ static{ System.loadLibrary("uart_runtime");//装载库 } publicMyUartService(){ _init();//注册本地方法,打开串口并初始化 } /* *uartnativemethods. */ publicStringUartDataUpdate(){ Strings=_uart_data_update(); returns;v }//更新采集的数据 publicintUartSendCmd(intn,intc){ _uart_send_cmd(n,c); return0; }//发送命令控制M0板 privatestaticnativeboolean_init();/声明jni库可以提供的方法 privatestaticnativeString_uart_data_update(); privatestaticnativeint_uart_send_cmd(intn,intc); uart_stub\include\uart.hstructuart_module_t{ structhw_module_tcommon; };//HAL规定不能直接使用hw_module_t结构,因此需要做这么一个继承。 structuart_control_device_t{ //自定义的一个针对Uart控制的结构,包含hw_device_t和支持的API操作 structhw_device_tcommon; /*attributes*/ /*supportingcontrolAPIsgohere*/ int(*uart_read_hal)(structuart_control_device_t*dev,char*buf,intcount); int(*uart_write_hal)(structuart_control_device_t*dev,constchar*cmd);}; #defineUART_HARDWARE_MODULE_ID"uart"//定义一个MODULE_ID,HAL层可以根据这个ID找到我们这个HALstub cn_com_smarthome_uart_MyUartService.cpp#defineLOG_TAG"MyUartService" #include"utils/Log.h" #include<stdlib.h> #include<string.h> #include<unistd.h> #include<assert.h> #include<jni.h> #include"../../uart_stub/include/uart.h" staticuart_control_device_t*sUartDevice=0; staticuart_module_t*sUartModule=0; JNINativeMethod是jni层注册的方法,Framework层可以使用这些方法*_init、uart_read、uart_write是在Framework中调用的方法名称,函数的类型及返回值如下: *()Z无参数返回值为bool型 *()Ljava/lang/String;无参数返回值为String型 *(II)I参数为2个int型返回值为int型 staticconstJNINativeMethodgMethods[]={ {"_init","()Z",(void*)uart_init}, {"_uart_data_update","()Ljava/lang/String;",(void*)uart_read}, {"_uart_send_cmd","(II)I",(void*)uart_write}, }; staticintregisterMethods(JNIEnv*env){ staticconstchar*constkClassName= "cn/com/smarthome/uart/MyUartService";//注意:必须和Framework层的service类名相 jclassclazz; /*lookuptheclass*/ clazz=env->FindClass(kClassName);//查找被注册的类 if(clazz==NULL){ LOGE("Can'tfindclass%s\n",kClassName); return-1; } /*registerallthemethods*/ if(env->RegisterNatives(clazz,gMethods, sizeof(gMethods)/sizeof(gMethods[0]))!=JNI_OK) { LOGE("Failedregisteringmethodsfor%s\n",kClassName); return-1; }//向类中注册本SO中Native的接口,接口定义在gMethods数组中 /*fillouttherestoftheIDcache*/ return0; } /****ThisiscalledbytheVMwhenthesharedlibraryisfirstloaded.*在Android系统初始化时,就会自动加载该JNI方法调用表。*当第一次加载此库时,调用此函数注册本地方法*/jintJNI_OnLoad(JavaVM*vm,void*reserved){ JNIEnv*env=NULL; jintresult=-1; LOGI("zzs_JNI_OnLoad"); if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){ LOGE("ERROR:GetEnvfailed\n"); gotofail; }//获取当前的VM的环境,保存在env变量中 assert(env!=NULL); if(registerMethods(env)!=0){ LOGE("ERROR:PlatformLibrarynativeregistrationfailed\n"); gotofail; }//自己写的函数,向当前JAVA环境中注册接口 /*success--returnvalidversionnumber*/ result=JNI_VERSION_1_4;fail: returnresult;}/*JNI_OnLoad()函数完成:(1)把虚拟机环境信息保存到本地库的一个结构体“JNIEnv”的实例中;(2)建立一个应用层中的UART控制服务与本地库的JNI函数表;(3)返回虚拟机本地库使用的JNI版本。*/ 5.uart_stub\module\uart.c#defineLOG_TAG"UartStub" #include<hardware/hardware.h> #include<fcntl.h> #include<termios.h> #include<errno.h> #include<cutils/log.h> #include<cutils/atomic.h> #include<sys/ioctl.h> #include"../include/uart.h"#include"crc16.h" #defineN6 #defineSTART0xAA//用于传输协议的宏#defineNEW0x01#defineINFO0x02 #defineRFID0x04 intfd; typedefstruct{ charhead; chardev_no; chartype_data; charlength; chartemp[2]; charhum[2]; charbright[2]; charadc[2]; characc[3]; charrfid[N]; shortcrc16; }dev_data;//传输协议的格式 //CRC16的校验函数,查表法,表在crc16.h内 staticunsignedshortget_crc16(constchar*crc_head,intcrc_lenth) { unsignedcharucCRCHi=0x0; unsignedcharucCRCLo=0x0; intiIndex; while(crc_lenth--){ iIndex=ucCRCLo^*(crc_head++); ucCRCLo=(unsignedchar)(ucCRCHi^aucCRCHi[iIndex]); ucCRCHi=aucCRCLo[iIndex]; } return(unsignedshort)(ucCRCHi<<8|ucCRCLo); } staticintuart_device_close(structhw_device_t*device) { structuart_control_device_t*ctx=(structuart_control_device_t*)device; if(ctx){ free(ctx); } close(fd); return0; } staticintuart_read_drv(structuart_control_device_t*dev,char*buf,intcount) { dev_datainfo_buf; charrev_buf[40]={0};//用于存放整个消息包 chardata_buf[40]={0};//用于存放消息包内的数据段 charch; ssize_tcur_size=0; ssize_tr_size=0; chardata_lenth=0;//数据段的长度 chardata_type;//数据类型 char*data_head;//数据段头 intdev_no; //设备号 char*crc_head;//用于CRC校验的头 intcrc_lenth; //用于crc校验的长度,从消息包头到数据段尾 unsignedshortcrc16;//校验值 inttimeout=10;//超时处理,长时间读不到消息,当timeout减到0时,返回到上层 while(1) { timeout--;//由于采用轮询读的方法,如果没消息则会一直循环,设置一个超时值,当超出后还没数据的话,就退出此次读消息 if(!timeout){ LOGI("Nostartinfo_buf"); retu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考素材关于希望的作文(10篇)
- 一份微笑一份希望作文250字150字(10篇)
- 线下推广活动场地租赁安全协议专业
- 喜洋洋与灰太狼之穿越时空450字(9篇)
- 修辞手法鉴赏古诗文经典句子教学教案
- 公交公司微笑活动方案
- 公交车读书日活动方案
- 公共文化进宗祠活动方案
- 公关创业活动方案
- 公务文书活动方案
- 转让幼儿园经营权协议书
- 2025履约保证金合同
- 2024全国初中数学竞赛试题及答案
- 人教版小学数学三年级下册《我们的校园》示范课教学课件
- 空调服务技术保障及人员培训方案
- 纤维绳索断裂机理研究-洞察分析
- 医院导医服务礼仪
- 《污水处理过程》课件
- 江苏省2024-2025年跨地区职业学校职教高考一轮联考(机械专业综合理论试卷含答案)
- 肿瘤患者心理护理与社会支持课件
- 《平衡计分卡在烟草公司绩效管理中的应用研究》
评论
0/150
提交评论