基于Zigbee的停车场空位检测系统毕业论文(8)

2018-11-21 21:24

基于Zigbee的停车场空位检测系统

Aps.c/h Nwk.c/h Mac.c/h Phy.c/h Neighbor.c/h Console.c/h Ieee _lrwpan _defs.h Lrwpan _config.h Debug.c/h Zep.c/h 应用层(APL)/支持层(APS)文件 网络层文件 介质访问控制层文件 物理层文件 邻居表,地址表函数 控制台输出函数 头文件,定义802.15.4 栈配置头文件 调试输出函数 端点0的设备函数 Aps.c/h文件中所提供的APL/APS函数接口在应用程序设计中非常重要,可在数据传输过程被调用以实现服务,或对栈内数据进行存取。表3中给出常见的APL/APS服务调用、访问和功能函数。

表3 常见APL/APS服务调用、访问和功能函数

函数 aplFormNetwork() aplGetStatus() aplJionNetwork() aplSendMSG() aplGetRxMsgData() aplGetMyShortAddress() aplInit aplWarmstart() apsBusy() ApsFSM() 功能 形成网络 返回服用调用的状态 尝试介入网络并运行协议栈 发送消息包 接收消息时返回消息数据的指针 返回节点短地址 初始化协议栈 换新协议栈 返回协议栈状态,忙时返回非0 顶层的状态机函数 本节中将以伪代码的形式,介绍各停车位传感器节点,路由,协调器以及停车卡是如何实现建立网络和入口以及泊车位的数据采集。 ①停车场网络初始化

ZigBee网络的初始化过程如下:首先,协调器创建网络。协调器进行信道扫描,进行网络发现,选择在最佳的空闲信道上创建网络。然后,非协调器节点扫描信道,进行网络发现,如指定PANID,则发现相

33

基于Zigbee的停车场空位检测系统

应ID的个域网才进行加入,否则加入到最先扫描到的网络;然后从邻居节点中选择合适的父节点,发送加入网络请求;加入网络。并获得一个16位的网络层地址。

协调器节点创建网络或者非协调器节点加入网络,其实现的难点和关键在于进行网络发现。如前所述,一般以有限状态机的方式进行网络发现。各节点身份不同,ROM中的程序代码也不同。

首先,协调器通过ZigBee协议栈提供的函数启动ZigBee网络(部分代码): aplFormNetwork();

while(apsBusy()) {apsFSM();}//等待网络建立

while(1) {apsFSM};} //协调器(coordinator)处理网络内传输的数据包

然后,各小区的路由器router不停的查找信道直到加入到一个ZigBee网络部分代码: do{

aplJoinNetwork();

while(apsBusy()) {apsFSM();} //wait for finish if (aplGetStatus()=LRWPAN _ STATUS_ SUCCESS){ //代表成功加入网络 break; } else{

my _timer= halGetMACTimer(); //否则等待两秒后重试加入网络 while((halMACTimerNowDelta(my_timer))< MSECS _TO _MACTICKS(2*1000)); } }while(1);

最后,终端节点查找信道直到加入网络。 do{

aplSendEndDeviceAnnounce(0); //查找协调器等待分配地址并连入网

while(apsBusy()) {apsFSM();}

if (aplGetStatus()=LRWPAN _STATUS_SUCCESS){ //}加入zigbee网络成功 break; } else{

//如果失败,等待两秒后重试直到加入网络 my_timer= halGetMACTimer();

while ((ha1MACTimerNowDelta(my timer))< MSECS _TO _ MACTICKS(2*1000)); }

34

基于Zigbee的停车场空位检测系统

} while(1);

到此,ZigBee网络建立完毕。

采用不同的拓扑结构时,组建的网络的规模有较大的区别,节点中的代码也有所区别。本系统中,采用的是mesh网络,理论上可以达到65000个节点,但实际上,当节点数上几千时,级跳太多,延时较长,节点间的同步会比较困难。

3.主控计算机接入网络的实现

目前,计算机接入ZigBee无线网络有多种方法。计算机可通过串口或并口直接连接协调器,也可考虑给计算机增加ZigBee设备直接加入无线网络。本例中,协调器和计算机物理位置近,主控计算机可通过物理连线直连协调器。

目前串口和并口直连技术成熟,工业应用广泛。计算机与数据采集模块或其它数字通信设备相连接时,要求高速的近距离通信则采用并口。而串口的传输速率较慢(20Kb/s ),但不易受干扰,可用于可靠的较远距离(1.5米以上,15m以内)的通信。

串口中使用较多的有RS-232, RS-485oRS-485通信距离更远(最远1200米),速度更快(最高lOMb/s)。但RS-232拥有成本低、技术简单、方便、容易实现的优点。且本系统中对数据传输速度的要求不高。

本系统的中央监控计算机选择RS-232串口与协调器通信。其受控端的单片机串口的通信也是相对简单的。下面分别描述中央计算机(主控端)、协调器(受控端)通信的实现。

1.中央计算机(主控端)

Windows平台下完成串口通信主要使用:ReadFile, WriteFile两函数。

在Windows中,ReadFile,WriteFile不仅可读写普通文件也可以访问系统中的各种外设如串口。不过,使用前应通知这两函数正确的初始化。初始化过程如下:

HANDLE hComm; hComm=CreateFile( gszPort,

GENERIC _ READ}GENERIC _WRITE, 0, 0,

OPEN _EXISTING,

FILE _FLAG _OVERLAPPED, 0);

if (hComm =INVALID_HANDLE _VALUE)

//如果打开失败,放弃;

通过获取到的hComm句柄,使用ReadFile, WriteFile等标准文件操作即可实现与协调器的通信。 初始化完成后,即可开始读写。 (1)串口读过程:

用CreateEvent创建重叠io,然后调用ReadFile发出读命令

35

基于Zigbee的停车场空位检测系统

DWORD dwRead;

BOOL fWaitingOnRead=FALSE; OVERLAPPED osReader={0};

osReader.hEvent=CreateEvent (NULL, TRUE, FALSE, NULL); if (osReader.hEvent==NULL) //如果创建失败,则放弃 if(!fWaitingOnRead){ //发出读命令.

if(!ReadFile(hComm, 1pBuf, READ _BUF_ SIZE, &dwRead, &osReader)) {

if (GetLastError()!=ERROR _IO _PENDING)// else

fWaitingOnRead=TRUE; //读取错误 }

else{ //处理读

HandleASuccessfulRead(1pBuf, dwRead);

}

}

第二步:重叠io等待事件发出信号,完成读操作 #define READ _TIMEOUT 500//等待0. 5秒 DWORD dwRes; if (fWaitingOnRead){

dwRes=WaitForSingle0bject(osReader.hEvent, READ _TIMEOUT); switch(dwRes) {

//完成读操作.

case WAIT _OBJECT_0:

if(!GetOverlappedResult(hComm, &osReader, &dwRead, FALSE)){ //通信错误,报告 else

//读操作成功完成

HandleASuccessfulRead(1pBuf, dwRead); //复位。准备下一次操作 fWaitingOnRead=FALSE;

36

基于Zigbee的停车场空位检测系统

break;}

case WAIT _TIMEOUT:

//操作未完成。fWaitingOnRead标记 //循环

//上一个读操作完成后发出第一个读命令 //后台处理 break;

default:

//WaitForSingle0bject错误,中止 //OVERLAPPED结构的问题 //event handle. break;

} }

(2)串口写过程:

在串口通讯中数据的传送和API下数据的读出有很多相似之处。下面摘录的代码显示了如何执行和等待写操作的完成。

BOOL WriteABuffer(char*lpBuf, DWORD dwToWrite) {

OVERLAPPED osWrite={0}; DWORD dwWritten; DWORD dwRes; BOOL fRes;

osWrite.hEvent=CreateEvent (NULL, TRUE, FALSE, NULL); if (osWrite. hEvent==NULL) return FALSE; //发出写操作.

if(!WriteFile(hComm, 1pBuf, dwToWrite, &dwWritten, &osWrite)) {

if (GetLastError()!=ERROR_ IO PENDING){ //写失败. fRes=FALSE; }

Else{ //写被挂起

dwRes=WaitForSingle0bject(osWrite.hEvent,INFINITE);

37


基于Zigbee的停车场空位检测系统毕业论文(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:国内外轴承钢发展现状及方向

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: