⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 command.c

📁 Zigbee模块的详细电路原理图和C代码.rar
💻 C
字号:
#include ".\zigbee\unet.h"


ADDR_LIST	stAddrList;
MAC_COMMAND stCommandCFM;

extern unsigned char 		UART_FLAG;
extern unsigned char		ucRecvBuff[250];
unsigned char UART_LEN;
extern short NetPlay_NetStatus;
//UINT8 LEDSTATUS = 0;
void SendData();
void unet_proc(void);

void WaitMS (UINT16 count)
{
	short i;
	while(count--)
		for(i=0; i<5000; i++);
}
/****************************************************************************************
*  	Function: 
*  	Description: 请求网络的地址列表功能函数
*  	Syntax: 
*	Modify: 
*	parameter:  无
*  	Returns:    成功标志
*  	Notes: 
*	Date: 2007-04-06
*	Author: ZijianWang
****************************************************************************************/
unsigned char ReqAddrList()
{
	unsigned char i;
	MCP_ADDR_LIST_REQ *AddrPtr;

	if( UnetSys.Coordinator == 0 )
	{
		AddrPtr = (MCP_ADDR_LIST_REQ *) RF_TX_BUFF;
	
		AddrPtr->Header.val = 0x8823;
		AddrPtr->SrcPID = UnetSys.JoinPID;
		AddrPtr->SrcAddr = UnetSys.NwkAddr;
			
		AddrPtr->DstAddr = 0;//UnetSys.JoinParent;
		AddrPtr->DstPID = UnetSys.JoinPID;
		AddrPtr->Seqnum = UnetSys.MacDSN;	
		UnetSys.MacDSN++;
		AddrPtr->COMM_ID = MT_ADDR_LIST_REQ;
		//AssoPtr->Cap.val = 0xca;
		AddrPtr->Cap = 0x0;
		
		i = 0;
		while(!UzTx(RF_TX_BUFF, sizeof(MCP_ADDR_LIST_REQ))) // Send request
		{
			WaitMS(20);
			i++;
			if(i>4)
			{
				return RETRY_EXCEED;
			}
		}
		
		usProtocolRecv = 500;
		while(( usProtocolRecv != 0 )&& ( stCommandCFM.cfm.RecvAddrListRsp != 1 ))	 
		{// Wait RecvAddrList response
			unet_proc();
		}
		if( usProtocolRecv == 0 )
		{
			return RETRY_EXCEED;
		}
		stCommandCFM.cfm.RecvAddrListRsp = 0;
	}
	for(i=0;i<stAddrList.ucAddrCont;i++)		//判断自己是否还在协调器的地址列表中
	{
		if(stAddrList.MACAddress[i] == UnetSys.NwkAddr )
		{
			break;
		}
	}
	if( i == stAddrList.ucAddrCont )		//相等说明没有在列表中找到自己的地址
	{
		UnetSys.Flag.JoinNetwork = 0;
		INIT_UNET();
		while(JOIN_UNET(UNET_PAN_ID, UNET_CHANNEL) != SUCCESS);
	}
	return SUCCESS;
}


/****************************************************************************************
*  	Function: 
*  	Description: 发送地址列表命令帧
*  	Syntax: 
*	Modify: 
*	parameter:  无
*  	Returns:    成功标志
*  	Notes: 
*	Date: 2007-04-06
*	Author: ZijianWang
****************************************************************************************/
unsigned char SendAddrList( unsigned short DstAddr )
{
	unsigned char Length;
	
	MCP_ADDR_LIST_RSP *AddrPtr;

	AddrPtr = (MCP_ADDR_LIST_RSP *) RF_TX_BUFF;

	AddrPtr->Header.val = 0x8823;
	AddrPtr->SrcPID = UnetSys.JoinPID;
	AddrPtr->SrcAddr = UnetSys.NwkAddr;
		
	AddrPtr->DstAddr = DstAddr;//UnetSys.JoinParent;
	AddrPtr->DstPID = UnetSys.JoinPID;
	AddrPtr->Seqnum = UnetSys.MacDSN;	
	UnetSys.MacDSN++;
	AddrPtr->COMM_ID = MT_ADDR_LIST_RSP;
	//AssoPtr->Cap.val = 0xca;
	AddrPtr->AddrCont = stAddrList.ucAddrCont;
	
	Length = stAddrList.ucAddrCont * 2;
	MSG_Copy(&RF_TX_BUFF[sizeof(MCP_ADDR_LIST_REQ)], (UINT8 *) stAddrList.MACAddress, Length);
	
	if(UzTx(RF_TX_BUFF, sizeof(MCP_ADDR_LIST_REQ) + Length)) return SUCCESS;
	
	return FAILURE;
	
}

/****************************************************************************************
*  	Function: 
*  	Description: 处理接收到的地址列表响应命令帧
*  	Syntax: 
*	Modify: 
*	parameter:  无
*  	Returns:    成功标志
*  	Notes: 
*	Date: 2007-04-06
*	Author: ZijianWang
****************************************************************************************/
void unet_rx_addrlist_rsp( MCP_ADDR_LIST_RSP * pAddrList )
{
	unsigned char Length;
	
	Length = pAddrList->AddrCont * 2;
	stAddrList.ucAddrCont = pAddrList->AddrCont;
	MSG_Copy( (UINT8 *)stAddrList.MACAddress, ((UINT8 *)pAddrList)+sizeof(MCP_ADDR_LIST_RSP), Length);
	stCommandCFM.cfm.RecvAddrListRsp = 1;	
}

/****************************************************************************************
*  	Function: 
*  	Description: 释放一个节点的数据库,重新连接链表
*  	Syntax: 
*	Modify: 
*	parameter:  unsigned char number  要释放的数据库在链表中的位置
*  	Returns:    无
*  	Notes: 
*	Date: 2007-04-06
*	Author: ZijianWang
****************************************************************************************/
void FreeChild( unsigned char number )
{
	unsigned char i;
	CHILD_LIST *currently, **pre;
	
	currently = UnetSys.ChildHead;
	pre = &(UnetSys.ChildHead); 
	for(i=0;i<number;i++)
	{
		pre = &(currently->Next);
		currently = currently->Next;
	}
	*pre = currently->Next;
	if(currently->Cap & 0x02)
	{
		UnetSys.JoinRouterCnt--;
	}
	else
	{
		UnetSys.JoinEndevCnt--;
	}
	MM_Free( currently );
}

/****************************************************************************************
*  	Function: 
*  	Description: 检查网络中各节点是否还在
*  	Syntax: 
*	Modify: 
*	parameter:  无
*  	Returns:    无
*  	Notes: 
*	Date: 2007-04-06
*	Author: ZijianWang
****************************************************************************************/
void ChackChild()
{
	unsigned char i,j,k,State;
	
	if( UnetSys.Coordinator == 0 )		//非协调器主动请求地址列表
	{	
		if( usAddrREQTimer == 0 )
		{
			usAddrREQTimer = 5000;
			State = FAILURE;
			for(i=0;i<3;i++)
			{
				if( State != SUCCESS )
				{
					State = ReqAddrList();
				}
				else
				{
					break;
				}
			}
			if(i == 3)		//说明3次都没有收到协调的应答,则断开连接
			{
				INIT_UNET();
//				while(JOIN_UNET(UNET_PAN_ID, UNET_CHANNEL) != SUCCESS);
				NetPlay_NetStatus = 0;
			}
		}	
	}
	else			//协调器判断是否有节点超时,该删除
	{
		for(i=0;i<stAddrList.ucAddrCont;i++)
		{
			if( stAddrList.LifeTime[i] == 0 )
			{
				for(k=i+1;k<stAddrList.ucAddrCont;k++)
				{
					stAddrList.LifeTime[k-1] = stAddrList.LifeTime[k];
					stAddrList.MACAddress[k-1] = stAddrList.MACAddress[k];
					for(j=0;j<8;j++)
					{
						stAddrList.Name[k-1][j] = stAddrList.Name[k][j];
					}
				}
				stAddrList.ucAddrCont --;
				FreeChild(i);//释放空间
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -