赞
踩
前言
到目前为止我也做个5、6个嵌入式项目,但以往都是从零开始自己做,也就是毫无计划,想到那里做那里,有想法就会去实现,就这样导致我碰到了很多坑,也消耗了我许多时间,当然,不是说这样不好,因为在其中我也得到了一个很好的锻炼与练习,但是这不适用于在工作中去这样做。
首先,在这里感谢华清远见的老师提供的安防监控系统项目的教学视频;它让我知道如何从零完成一个实际开发中的项目制作,它帮我理清了项目制作的思路,也让我明白了一个好的计划与协议对于一个项目有多么重要。
在设计嵌入式项目时,
尽量在之前设计并绘制好项目的分层体系框架图
;
对于几乎大部分的嵌入式项目所涉及的都是多平台、多任务的开发;
以本项目来说,涉及到
那么就需要将整个项目分层设计,将每一个平台分为一个成单独处理(可考虑多进程与多线程),在制定通信协议与选择通信方式可以让不同平台相互连接,当一个项目出现问题时,可以很快的定位到哪一层、哪一个任务出现了问题,不仅如此也方便了多数人的分工合作。
已本项目的分层设计为例:
嵌入式设计的最终目的是
完成数据的正确传输
,对于传输方式可以有多种,例如:蓝牙、wifi、3G/4G、串口等;
了解项目的数据流向,可以帮助我们正确的去绘制软件的体系框架、制定合理的通信内容、选择合适的通信方式。
以本项目为例:
本项目中的数据流向为
通信方式:
通信内容
,即通讯结构体包含了我们要传递的数据内容
这样让整个项目中的信息都以相同的信息方式进行传输,方便于我们统一整个整个线程或者进程的通信
比如在本次项目中
数据上传部分:
数据类型定义 typedef uint8_t unsigned char; typedef uint16_t unsigned short; typedef uint32_t unsigned int; //考虑到内存对齐的问题 struct makeru_zigbee_info { uint8_t head[3]; //标识位: 'm' 's' 'm' makeru-security-monitor uint8_t type; //数据类型 'z'---zigbee 'a'---a9 ------------->crc ...加密算法 <-------------- float temperature; //温度 float humidity; //湿度 float light; //光强 float tempMIN; //温度下限 float tempMAX; //温度上限 float humidityMIN; //湿度下限 float humidityMAX; //湿度上限 float lightMIN; //光强下限 float lightMAX; //光强上限 uint32_t reserved[2]; //保留扩展位,默认填充0 //void *data; 内核预留的扩展接口 参考版 }; struct makeru_a9_info { uint8_t head[3]; //标识位: 'm' 's' 'm' makeru-security-monitor uint8_t type; //数据类型 'z'---zigbee 'a'---a9 uint32_t adc; //adc电压 uint32_t reserved[2]; //保留扩展位,默认填充0 //void *data; 内核预留的扩展接口 参考版 }; struct makeru_env_data { struct makeru_a9_info a9_info; //a9上传数据 struct makeru_zigbee_info zigbee_info; //zigbee上传数据 };
数据的下发:(采用消息队列的方式下发数据到下位机上)
//消息队列结构体 #define QUEUE_MSG_LEN 32 struct msg { long type; //从消息队列接收消息时用于判断的消息类型 long msgtype;//具体的消息类型 === 设备类型 unsigned char text[QUEUE_MSG_LEN]; //消息正文 ====> CMD 控制指定的设备 }; long msgtype;//具体的消息类型 消息类型的分配: 1L: LED控制 2L: 蜂鸣器控制 3L: 风扇 4L: 温湿度、光强最值设置 5L-6L-7L-8L,用于个人的扩展 9L: 3G通信模块-GPRS switch(msgbuf.msgtype){ case 1L: ... break; .... default .... break; } A9-ZIGBEE通用指令 命令格式: 一个字节, unsigned char 对应消息队列中正文的类型: 8位 ---------------------------------------- 7 6 | 5 4 | 3 2 1 0 平台编号 | 设备编号 | 操作设备 ---------------------------------------- 平台编号 0x00 00-0号-ZigBee平台 0x40 01-1号-A9平台 0x80 10-2号-STM32平台(扩展) 0xc0 11-3号-保留(扩展) ---------------------------------------- 设备编号 操作掩码 0x00 LED 0x00 全部关闭 0x40 0x01 全部打开 0x41 0x02 打开LED2 0x42 0x03 打开LED3 0x43 0X04 打开LED4 0x44 0x05 打开LED5 0x45 0x06 关闭LED2 0x46 0x07 关闭LED3 0x47 0x08 关闭LED4 0x48 0x09 关闭LED5 0x49 ---------------------------------------- 0x10 蜂鸣器 0x00 关闭 0x50 0x01 打开 0x51 0x02 自动报警关闭 0x52 0x03 自动报警打开 0x53 ---------------------------------------- 0x20 风扇 0x00 关闭风扇 0x20 0x01 打开风扇 0x21 ---------------------------------------- 0x30 扩展 ---------------------------------------- 控制命令: 平台编号 + 设备编号 + 操作掩码 = 命令 (命令的封装) 例如: 0x00 + 0x20 + 0x01 = 0x21 风扇打开 0x40 + 0x10 + 0x01 = 0x51 蜂鸣器打开
本次项目的设计中,采用HTML的方式进行web网页绘制,采用CGI对网页数据进行处理,使用boa服务器实现不同语言之间的通信,HTML与cgi之间的通讯使用form表单来实现的;这便是用户层的开发。
从网页发送消息到A9
,通过CGI将网页的数据进行转化,并将数据添加到消息队列
,这里便用到了消息队列的知识点,包括消息队列的创建(msgget)、接收消息(msgrcv)、发送消息(msgsnd);
从A9刷新数据到网页
是通过共享内存
来实现的,CGI得到共享内存的数据并发送到网页上。这里就用到了共享内存的知识点,包括共享内存的创建(shmget)、映射(shmat)、撤销映射(shmdt);同时要加上信号量进行临界资源同步操作;
A9平台是作为项目的核心平台,它使用多线程将多个任务分开处理与运行,并采用互斥锁、信号量、条件变量完成线程间的同步与互斥。
A9平台通过串口向下控制ZigBee协调器,向上通过网线与PC端网页进行数据交互,这其中都需要线程分开进行处理。
环境采集需要考虑到采集的内容,然后选择相应的传感器将要采集的环境信息数字化,这需要知道单片机开发的相关知识,要读懂芯片手册;以及了解传感器的用法以及数据处理的方法;并且掌握ZigBee无线传输的原理。
可能还有很多东西还要讲,但博主本人知识有限,无法讲的很全面,这里只是总结了一下从我做项目到现在的总结与感悟。我认为最重要的还是多去参与项目制作、多动手实践,这样才有一套自己的项目制作流程经验,感谢您能看到这里。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。