基于armcortex-a8内核的嵌入式智能家毕业论文(编辑修改稿)内容摘要:

(TRUE) { pTxData[0] = KeyScan()。 // 键 值扫描 if(pTxData[0]!= 0) { basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH)。 halIntOff(); halIntOn()。 } } 这段程序可以说,是发送模块的精华,或者说是核心。 Appswich()函数进来之后,首先是一个错误返回机制,如果两个 Zigbee 连接不成功,会返回 fail。 连接成功后, Zigbee 会打开发送函数,做好发送准备。 同时关闭接收 功能,基于 ARMcortexA8 内核的嵌入式智能家居系统的设计与开发 9 保证模块的运行速度和稳定性。 接下来程序会进入 while()循环,只要 Zigbee保持连接,发送模块就会一直处准备在发送模式或者正在发送模式。 由于使用的是四个开关量传感器,这里作为四个按键,不停地对连接了四个传感器的 IO 关键进行按键扫描,获取相应的键值,并赋值给 Pxdata[]数组,并使用系统调用函数 basicRfSendPacket()将信息发送出去。 basicRfSendPacket 这个函数也是整段程序的核心,只有调用这个函数才能将 IO 口接收到的数据有序的发送出去,完成信息的远程传输 [9]。 下面再来 看一下接收模块的核心代码。 = LIGHT_ADDR。 if(basicRfInit(amp。 basicRfConfig)==FAILED) { HAL_ASSERT(FALSE)。 } basicRfReceiveOn()。 UartInitial()。 while (TRUE) { while(!basicRfPacketIsReady())。 if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)0) { { Delayms1(500)。 halLedToggle(1)。 UartSend_String(Lcddata,5)。 UartSend_String(pRxData,1)。 UartSend_String(Reddata,2)。 } } } 这段程序和发送程序的主体架构是一样的,不过是使用了调用函数basicRfReceive,来接受发送函数发送过来的数据,同时初始化了 Zigbee 模块的UART1,将来自发送模块的数据打包处理后通过串口发送出去,并可以通过超基于 ARMcortexA8 内核的嵌入式智能家居系统的设计与开发 10 级终端看到所接收到的数据,通过接受到的具体数据查看到底是触发了什么节点,触动警报。 下图 31 为超级终端接受传感器信号的数据 [10]。 图 31 超级终端截图 同时 Zigbee 也可以接受来自超级终端的数据(在这里超级终端作为开发板的一个替代品),如图 32 在超级终端发送 ledon 命令, Zigbee 的一个 IO 管教被拉高, led 灯亮发送 ledoff, led 灯灭如图 32。 图 32 Zigbee 控制效果图 基于 ARMcortexA8 内核的嵌入式智能家居系统的设计与开发 11 Zigbee 的接收终端数据程序其实也非常简单,是使用串口中断来做的,即只要串口检测收有数 据接收,就会产生中断,注册标志位,然后拉高相应管脚,实现对 led 灯的控制。 代码如下: pragma vector = URX0_VECTOR __interrupt void UART0_ISR(void) { URX0IF = 0。 if(U0DBUF 0) { P1_4=~P1_4。 temp = U0DBUF。 } } 整个 Zigbee 模块的程序架构,如图 33。 图 33 Zigbee 代码工程结构图 基于 ARMcortexA8 内核的嵌入式智能家居系统的设计与开发 12 linux 嵌入式系统搭建 首先需要说明的是本次嵌入系统,是基于前人原有的开源代码消化吸收后,然后添加的驱动代码最终实现的,这里也是充分的发挥了 linux 嵌入式的开源性。 本嵌入式系统结构主要分为了三大块,分 别是: emilib : 抽象数据通信。 Hmanager:基于 QT的 PC 端图形控制程序。 Bdehmanager:基于 QT 的开发板图形控制程序。 emilib 数据通信模块介绍 Emilib 工作原理 消息接受者首先需要完成注册,所谓注册即通过 socket 连接本地 emi_core进程,将本进程进程号以及要注册的消息发送给 emi_core。 Emi_core 收到消息后,需要在内部表记录了(消息号,进程号)之间的关系。 每一个注册消息的进程只要成功注册了,就会在表里新增一个项,记录该进程注册的消息号和进程号。 然后当发送端给 emi_core 发消息时, emi_core 会把消息好在表里进行匹配,如果是正常情况,那么其会找到注册进程的进程号,此时 emi_core 会给该进程发送一个 USER2 信号,同时附加数据放到共享的内存 中。 而接受进程接收到这个信号之后,就会触发信号处理函数,其实这个原理个人认为其实完全可以理解为一个中断向量表的工作原理,不过它可以同时处理多个进程。 最后在信号处理函数内部从 emi_core 提供的共享内存中读取发送端发来的信息。 如此就完成了一次数据通信。 Emilib 的使用方法 首先来介绍下,刚才提到的 emi_core。 emi_core 相当于一个中介或者说就是一个电话接线员,主要完成了两部分的工作。 首先是接注册类的消息,并把消息和一个函数绑定。 然后是接收发送类型消息,查找到已经被绑定的消息函数对,匹配出相 同的消息,最后运行对应的函数。 Emilib 中包含 了 库。 主要工作就是提供进程需要的函数,来实现具体功能,接收进程调用库中的函数进行消息好和函数的绑定注册,而发送进程基于 ARMcortexA8 内核的嵌入式智能家居系统的设计与开发 13 调用库中的函数进行消息发送。 下面列出的是 中常用的函数 ( 1)初始化函数 Int emi_ini(void)。 这绝对是最常用也是最重要的函数,因为它必须在注册消息之前运行,但是每个进程只需要运行一次。 ( 2)消息注册函数 Int emi_msg_register_exclusice(eu32msg,emi_func func)。 返回值为 0 时代表成功,负数代表失败,两个参数分别代表要注册的消息号,和一个指向结构体的结构体指针,当然要求其提前被写好。 ( 3)发送消息函数 Int emi_msg_send_highlevel_blockreturn(char * ipaddr, int msgnum, int send_size, void *send_data, int ret_size,void *ret_data,eu32 cmd) 返回值为 0 代表发送成功,负数代表失败。 参数 ipaddr 表示接受平 台的 ip。 参数 msgnum表示要发送的消息号。 参数 send_size 以及 send_data 分别代表附加数据的长度和附加数据的首地址,如果没有那么就应该设置为 0 和 NULL。 参数 ret_size 和 ret_data 表示返回数据的大小和首地址。 参数 cmd,表示发送者要发送给接受者的命令。 Emilib 的测试 首先需要进入 emitest 目录 ,先建两个 emi 测试源文件分别用于发送和接受,来模拟通信过程。 cd emitest vim vim 以下是在实验中 对于 emilib 所做测试的一部分核心代码。 添加到 源文件的核心代码。 char hello[20]=hello。 char buf[5]={0}。 基于 ARMcortexA8 内核的嵌入式智能家居系统的设计与开发 14 emi_msg_send_highlevel_blockreturn(,12345678,6,hello,4,buf,5)。 printf(%s\n,buf)。 添加到 源文件的核心代码: int test_func(struct emi_msg *msg){ printf(msgcmd %d, msgdata %s\n,msgcmd, msgdata)。 return emi_msg_prepare_return_data(msg,hel,4)。 } Main 函数代码如下: emi_init()。 emi_msg_register_exclusive(12345678,test_func)。 while(1){ sleep(1)。 } 然后编译 以及 : gcc o receiver L../bs/pclib/lib lemi I../libs/pclib/include gcc o sender L../libs/pclib/lib lemi I../libs/pclib/include 编译完成之后生成了可执行文件接着运行测试,首先启动 PC 机的 emi_core程序, 然后分别在两个终端启动 sender 和 receiver。 sudo ../libs/pclib/bin/emi_core d (一个终端 ) ./reciever (另一终端 ) ./sender 最后的运行结果为运行结果。 在发送终端会显示: hello 在接收终端会显示: msgcmd 5, msgdata hello 证明收发消息成功。 环境部署以及 eh_server 基于 ARMcortexA8 内核的嵌入式智能家居系统的设计与开发 15 下面来大体介绍下 eh_server, eh_serve 主要实现。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。