记录一下最近参加物联网大赛写的其中一个demo吧,由于之前网上审核那段时间本来把代码都已经写好了的。怪自己手贱忘记备份,在原来的基础上把代码改了,结果代码就给改死了 哇,最近这几天真的是欲哭无泪啊(-__-)~~~
简述一下我们的项目吧,我们要做的是长期记录老人常见的一些遗忘性动作,如忘吃药,多吃药,忘关门,忘浇水,忘关炉灶。将每日采集的传感数据通过协调器发送给上位机完成对数据的分析与处理。
然后我记录一下我最近重构的时候遇到的坑,当我用仿真器将代码烧进去之后。我现在还搞不懂为什么阅读器就是无法正常工作进行寻卡。最后我将其拔了换电源供电然后再重启,就可以正常工作了。我怀疑的是可能仿真器的引脚和我的阅读器上的引脚有些重了。(但是就算是重了,仿真器下载完程序之后就应该不会占用引脚了吧,希望有知道的大哥能够指点一下)
下面的是我买的zigbee原理图
然后就是接线
上代码 注意烧写两个终端的时候需要稍微注意一下,让它们发给协调器的阅读器编号不一样。因为是同一份代码,所以需要对
txbuf该注释的注释。我的设计思想是两个终端(编号为1和2),如果终端1没寻到卡,af函数发送一个长度为1的字符串,具体值为1即txbuf[0]=1;如果寻到卡就发送长度为2的字符串,txbuf[1]=1。如果终端2没寻到卡,类似地调用af函数发送一个长度为1的字符串,具体值为1即txbuf[0]=2;如果寻到卡就发送长度为2的字符串,txbuf[1]=2。这块代码如下:
if(error>0) //说明未寻到卡或者读写失败
{
uint8 txbuf[1];
//txbuf[0]=1;
txbuf[0]=2;
HalLcdWriteString( "Nothing or error", HAL_LCD_LINE_3 );
if ( AF_DataRequest( &SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID,
1,
txbuf,
&SerialApp_MsgID,
0,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
// Successfully requested to be sent.
}
else
{
// Error occurred in request to send.
}
}
else //正常寻到卡了
{
uint8 txbuf[2];
//输出显示
PrintfRfidCard(SendBuf, 6);
// txbuf[1] = 1;
txbuf[1] = 2;
//发送给协调器
if ( AF_DataRequest( &SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID,
2,
txbuf,
&SerialApp_MsgID,
0,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
// Successfully requested to be sent.
}
else
{
// Error occurred in request to send.
}
}
协调器的处理设计是,先判断收到的字符串长度是1还是2;如果长度是1则说明寻卡失败具体谁失败还要具体看内容是1还是2,如果是1代表终端1寻卡失败,如果是2说明终端2寻卡失败。如果收到的长度是2,则说明寻到卡了,具体是谁寻到了也要看具体内容。下面是协调器处理这块的逻辑代码:
case SERIALAPP_CLUSTERID://处理终端发上来的RFID信息
uint8 card_status[30];
uint8 strr[30];
if(pkt->cmd.DataLength==1)//当协调器收到长度为1 的空中数据
{
sprintf(strr,"data[0]=%d\r\n",pkt->cmd.Data[0]);
HalUARTWrite(0,strr,strlen(strr)+1);
if(pkt->cmd.Data[0] == 1)//如果发来的是1代表1号阅读器
{
if(flag1 != 0)//防止多次串口打印
{
sprintf(card_status,"1--Inventoury Failed\r\n");
HalUARTWrite(0,card_status,strlen(card_status)+1);
flag1 = 0;
}
}
else if(pkt->cmd.Data[0]==2)
{
sprintf(strr,"data[0]=%d [1]=%d\r\n",pkt->cmd.Data[0],pkt->cmd.Data[1]);
HalUARTWrite(0,strr,strlen(strr)+1);
if(flag2 != 0)
{
sprintf(card_status,"2--Inventoury Failed\r\n");
HalUARTWrite(0,card_status,strlen(card_status)+1);
flag2 = 0;
}
}
}
else if(pkt->cmd.DataLength==2)
{
if(pkt->cmd.Data[1]==1)
{
if(flag1 != 1)
{
sprintf(card_status,"1--Inventoury Success\r\n");
HalUARTWrite(UART0,card_status,strlen(card_status)+1);
flag1 = 1;
}
}
else if(pkt->cmd.Data[1]==2)
{
if(flag2 != 1)
{
sprintf(card_status,"2--Inventoury Success\r\n");
HalUARTWrite(UART0,card_status,strlen(card_status)+1);
flag2 = 1;
}
}
}
break;
下面是整个应用层是的代码,里面包含了大量的宏定义和具体的mfrc522的驱动程序就不解释了。
/*********************************************************************
* INCLUDES
*/
#include <stdio.h>
#include <string.h>
#include "AF.h"
#include "OnBoard.h"
#include "OSAL_Tasks.h"
#include "SerialApp.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "hal_drivers.h"
#include "hal_key.h"
#if defined ( LCD_SUPPORTED )
#include "hal_lcd.h"
#endif
#include "hal_led.h"
#include "hal_uart.h"
#include "nwk_globals.h"
#include "mfrc522.h"
/*********************************************************************
* MACROS
*/
#define COORD_ADDR 0x00
#define ED_ADDR 0x01
#define UART0 0x00
#define MAX_NODE 0x04
#define UART_DEBUG 0x00 //调试宏,通过串口输出协调器和终端的IEEE、短地址
//表示是传感器节点,还是RFID或者步进电机
/rfid定义
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1
//字节块地址取反+1字节块地址+1字节块地址取反
unsigned char data2[4] = {0x12,0,0,0};
unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char g_ucTempbuf[20];
unsigned char MLastSelectedSnr[4];
unsigned char RevBuffer[30];
unsigned char SerBuffer[20];
unsigned char CmdValid;
unsigned char waitCommData=1;
int data_len=0;
int data_index=0;
/*********************************************************************
* CONSTANTS
*/
#if !defined( SERIAL_APP_PORT )
#define SERIAL_APP_PORT 0
#endif
#if !defined( SERIAL_APP_BAUD )
//#define SERIAL_APP_BAUD HAL_UART_BR_38400
#define SERIAL_APP_BAUD HAL_UART_BR_115200
#endif
// When the Rx buf space is less than this threshold, invoke the Rx callback.
#if !defined( SERIAL_APP_THRESH )
#define SERIAL_APP_THRESH 64
#endif
#if !defined( SERIAL_APP_RX_SZ )
#define SERIAL_APP_RX_SZ 128
#endif
#if !defined( SERIAL_APP_TX_SZ )
#define SERIAL_APP_TX_SZ 128
#endif
// Millisecs of idle time after a byte is received before invoking Rx callback.
#if !defined( SERIAL_APP_IDLE )
#define SERIAL_APP_IDLE 6
#endif
// Loopback Rx bytes to Tx for throughput testing.
#if !defined( SERIAL_APP_LOOPBACK )
#define SERIAL_APP_LOOPBACK FALSE
#endif
// This is the max byte count per OTA message.
#if !defined( SERIAL_APP_TX_MAX )
#define SERIAL_APP_TX_MAX 30
#endif
#define SERIAL_APP_RSP_CNT 4
// This list should be filled with Application specific Cluster IDs.
const cId_t SerialApp_ClusterList[SERIALAPP_MAX_CLUSTERS] =
{
SERIALAPP_CLUSTERID
};
const SimpleDescriptionFormat_t SerialApp_SimpleDesc =
{
SERIALAPP_ENDPOINT, // int Endpoint;
SERIALAPP_PROFID, // uint16 AppProfId[2];
SERIALAPP_DEVICEID, // uint16 AppDeviceId[2];
SERIALAPP_DEVICE_VERSION, // int AppDevVer:4;
SERIALAPP_FLAGS, // int AppFlags:4;
SERIALAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)SerialApp_ClusterList, // byte *pAppInClusterList;
SERIALAPP_MAX_CLUSTERS, // byte AppNumOutClusters;
(cId_t *)SerialApp_ClusterList // byte *pAppOutClusterList;
};
const endPointDesc_t SerialApp_epDesc =
{
SERIALAPP_ENDPOINT,
&SerialApp_TaskID,
(SimpleDescriptionFormat_t *)&SerialApp_SimpleDesc,
noLatencyReqs
};
/*********************************************************************
* TYPEDEFS
*/
/*********************************************************************
* GLOBAL VARIABLES
*/
uint8 SerialApp_TaskID; // Task ID for internal task/event processing.
/*********************************************************************
* EXTERNAL VARIABLES
*/
/*********************************************************************
* EXTERNAL FUNCTIONS
*/
/*********************************************************************
* LOCAL VARIABLES
*/
static bool SendFlag = 0;
static uint8 SerialApp_MsgID;
static afAddrType_t SerialApp_TxAddr;
static afAddrType_t Broadcast_DstAddr;
static uint8 SerialApp_TxSeq;
static uint8 SerialApp_TxBuf[SERIAL_APP_TX_MAX+1];
static uint8 SerialApp_TxLen=0;
static afAddrType_t SerialApp_RxAddr;
static uint8 SerialApp_RspBuf[SERIAL_APP_RSP_CNT];
static devStates_t SerialApp_NwkState;
static afAddrType_t SerialApp_TxAddr;
static uint8 SerialApp_MsgID;
/*********************************************************************
* LOCAL FUNCTIONS
*/
static void SerialApp_HandleKeys( uint8 shift, uint8 keys );
static void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt );
static void SerialApp_Send(void);
static void SerialApp_Resp(void);
static void SerialApp_CallBack(uint8 port, uint8 event);
static void PrintAddrInfo(uint16 shortAddr, uint8 *pIeeeAddr);
static void AfSendAddrInfo(void);
static void GetIeeeAddr(uint8 * pIeeeAddr, uint8 *pStr);
static void SerialApp_SendPeriodicMessage( void );
static uint8 GetDataLen(uint8 fc);
static uint8 GetLamp( void );
static uint8 GetGas( void );
static uint8 XorCheckSum(uint8 * pBuf, uint8 len);
static uint8 SendData(uint8 addr, uint8 FC);
#if defined(ZDO_COORDINATOR)
#else
static void SerialApp_SendData_DHT11();
static void SerialApp_SendData_MQ2();
static void SerialApp_SendData_Human();
static void SerialApp_SendData_Lamp(uint8 fc);
static void SetLamp(bool on);
static uint8 GetHuman( void );
static uint8 Contrl_Step_motor(int state, float count);
static void RfidFindCard();
static void RfidConflict();
#endif
/*********************************************************************
* @fn SerialApp_Init
*
* @brief This is called during OSAL tasks' initialization.
*
* @param task_id - the Task ID assigned by OSAL.
*
* @return none
*/
void SerialApp_Init( uint8 task_id )
{
halUARTCfg_t uartConfig;
P0DIR |= 0xF0; //P0_4、P0_5、P0_6、P0_7定义为输出
P1DIR |= 0x21;//p1_0,P15输出
P0 |= 0xF0; //P0_4、P0_5、P0_6、P0_7输出1
P1 |= 0x21; //P1_0,P15输出高电平
P0SEL &= ~0x40; //设置P0.6口为普通IO
P0DIR &= ~0x40; //设置P0.6为输入
CmdValid=0;
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
SerialApp_TaskID = task_id;
//SerialApp_RxSeq = 0xC3;
afRegister( (endPointDesc_t *)&SerialApp_epDesc );
RegisterForKeys( task_id );
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = SERIAL_APP_BAUD;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = SERIAL_APP_RX_SZ; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = SERIAL_APP_TX_SZ; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = SERIAL_APP_IDLE; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = SerialApp_CallBack;
HalUARTOpen (UART0, &uartConfig);
#if defined ( LCD_SUPPORTED )
HalLcdWriteString( "SerialApp", HAL_LCD_LINE_2 );
#endif
// HalUARTWrite(UART0, "Init", 4);
//ZDO_RegisterForZDOMsg( SerialApp_TaskID, End_Device_Bind_rsp );
//ZDO_RegisterForZDOMsg( SerialApp_TaskID, Match_Desc_rsp );
}
/*********************************************************************
* @fn SerialApp_ProcessEvent
*
* @brief Generic Application Task event processor.
*
* @param task_id - The OSAL assigned task ID.
* @param events - Bit map of events to process.
*
* @return Event flags of all unprocessed events.
*/
UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )
{
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG )
{
afIncomingMSGPacket_t *MSGpkt;
while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SerialApp_TaskID )) )
{
switch ( MSGpkt->hdr.event )
{
case ZDO_CB_MSG:
//SerialApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
break;
case KEY_CHANGE:
SerialApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
case AF_INCOMING_MSG_CMD:
SerialApp_ProcessMSGCmd( MSGpkt );
break;
case ZDO_STATE_CHANGE:
SerialApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (SerialApp_NwkState == DEV_ZB_COORD)
|| (SerialApp_NwkState == DEV_ROUTER)
|| (SerialApp_NwkState == DEV_END_DEVICE) )
{
#if defined(ZDO_COORDINATOR) //协调器通过串口输出自身短地址、IEEE
Broadcast_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
Broadcast_DstAddr.endPoint = SERIALAPP_ENDPOINT;
Broadcast_DstAddr.addr.shortAddr = 0xFFFF;
#if UART_DEBUG
PrintAddrInfo( NLME_GetShortAddr(), aExtendedAddress + Z_EXTADDR_LEN - 1);
#endif
#else //终端无线发送短地址、IEEE
AfSendAddrInfo();
//联网成功启动周期性上报事件
osal_start_timerEx( SerialApp_TaskID,
SERIALAPP_SEND_PERIODIC_EVT,
SERIALAPP_SEND_PERIODIC_TIMEOUT );
#endif
}
break;
default:
break;
}
osal_msg_deallocate( (uint8 *)MSGpkt );
}
return ( events ^ SYS_EVENT_MSG );
}
//在此事件中可以定时向协调器发送节点传感器参数信息
if ( events & SERIALAPP_SEND_PERIODIC_EVT )
{
SerialApp_SendPeriodicMessage();
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_SEND_PERIODIC_EVT,
(SERIALAPP_SEND_PERIODIC_TIMEOUT + (osal_rand() & 0x00FF)) );
return (events ^ SERIALAPP_SEND_PERIODIC_EVT);
}
if ( events & SERIALAPP_SEND_EVT )
{
SerialApp_Send();
return ( events ^ SERIALAPP_SEND_EVT );
}
if ( events & SERIALAPP_RESP_EVT )
{
SerialApp_Resp();
return ( events ^ SERIALAPP_RESP_EVT );
}
return ( 0 );
}
/*********************************************************************
* @fn SerialApp_HandleKeys
*
* @brief Handles all key events for this device.
*
* @param shift - true if in shift/alt.
* @param keys - bit field for key events.
*
* @return none
*/
void SerialApp_HandleKeys( uint8 shift, uint8 keys )
{
zAddrType_t txAddr;
if ( keys & HAL_KEY_SW_6 ) //按S1键启动或停止终端定时上报数据
{
if(SendFlag == 0)
{
SendFlag = 1;
HalLedSet ( HAL_LED_1, HAL_LED_MODE_ON );
osal_start_timerEx( SerialApp_TaskID,
SERIALAPP_SEND_PERIODIC_EVT,
SERIALAPP_SEND_PERIODIC_TIMEOUT );
}
else
{
SendFlag = 0;
HalLedSet ( HAL_LED_1, HAL_LED_MODE_OFF );
osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_SEND_PERIODIC_EVT);
}
}
if ( keys & HAL_KEY_SW_1 ) //按S2
{
//LAMP_PIN = ~LAMP_PIN;
// Contrl_Step_motor(0, 0.1);
// RfidFindCard();
}
if ( keys & HAL_KEY_SW_2 )
{
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
// Initiate an End Device Bind Request for the mandatory endpoint
txAddr.addrMode = Addr16Bit;
txAddr.addr.shortAddr = 0x0000; // Coordinator
ZDP_EndDeviceBindReq( &txAddr, NLME_GetShortAddr(),
SerialApp_epDesc.endPoint,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE );
}
if ( keys & HAL_KEY_SW_3 )
{
}
if ( keys & HAL_KEY_SW_4 )
{
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );
// Initiate a Match Description Request (Service Discovery)
txAddr.addrMode = AddrBroadcast;
txAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
ZDP_MatchDescReq( &txAddr, NWK_BROADCAST_SHORTADDR,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE );
}
}
static void SerialApp_SendDataToEndDevice(uint8* data, int len)
{
if(data==NULL)
{
return;
}
Broadcast_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
Broadcast_DstAddr.endPoint = SERIALAPP_ENDPOINT;
Broadcast_DstAddr.addr.shortAddr = 0xFFFF;
if (afStatus_SUCCESS == AF_DataRequest(&Broadcast_DstAddr,
(endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID,
len, data,
&SerialApp_MsgID, 0, AF_DEFAULT_RADIUS))
{
}
else
{
}
}
//BCD转ASC码表
char NumberToLetter(unsigned char number)
{
char buff[]="0123456789ABCDEF";
if(number>15) return 0;
return buff[number];
}
uint8 flag1 = 2,flag2 = 2;//2代表未知状态,1代表寻到,0代表没寻到
void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )
{
uint16 shortAddr;
uint8 *pIeeeAddr;
uint8 delay;
uint8 afRxData[30]={0};
uint8 afDataLen=0;
switch ( pkt->clusterId )
{
// A message with a serial data block to be transmitted on the serial port.
case SERIALAPP_CLUSTERID://处理终端发上来的RFID信息
uint8 card_status[30];
uint8 strr[30];
if(pkt->cmd.DataLength==1)//当协调器收到长度为1 的空中数据
{
sprintf(strr,"data[0]=%d\r\n",pkt->cmd.Data[0]);
HalUARTWrite(0,strr,strlen(strr)+1);
if(pkt->cmd.Data[0] == 1)//如果发来的是1代表1号阅读器
{
if(flag1 != 0)//防止多次串口打印
{
sprintf(card_status,"1--Inventoury Failed\r\n");
HalUARTWrite(0,card_status,strlen(card_status)+1);
flag1 = 0;
}
}
else if(pkt->cmd.Data[0]==2)
{
sprintf(strr,"data[0]=%d [1]=%d\r\n",pkt->cmd.Data[0],pkt->cmd.Data[1]);
HalUARTWrite(0,strr,strlen(strr)+1);
if(flag2 != 0)
{
sprintf(card_status,"2--Inventoury Failed\r\n");
HalUARTWrite(0,card_status,strlen(card_status)+1);
flag2 = 0;
}
}
}
else if(pkt->cmd.DataLength==2)
{
if(pkt->cmd.Data[1]==1)
{
if(flag1 != 1)
{
sprintf(card_status,"1--Inventoury Success\r\n");
HalUARTWrite(UART0,card_status,strlen(card_status)+1);
flag1 = 1;
}
}
else if(pkt->cmd.Data[1]==2)
{
if(flag2 != 1)
{
sprintf(card_status,"2--Inventoury Success\r\n");
HalUARTWrite(UART0,card_status,strlen(card_status)+1);
flag2 = 1;
}
}
}
break;
// A response to a received serial data block.
case SERIALAPP_CLUSTERID2:
if ((pkt->cmd.Data[1] == SerialApp_TxSeq) &&
((pkt->cmd.Data[0] == OTA_SUCCESS) || (pkt->cmd.Data[0] == OTA_DUP_MSG)))
{
SerialApp_TxLen = 0;
osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_SEND_EVT);
}
else
{
// Re-start timeout according to delay sent from other device.
delay = BUILD_UINT16( pkt->cmd.Data[2], pkt->cmd.Data[3] );
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_SEND_EVT, delay );
}
break;
default:
break;
}
}
/*********************************************************************
* @fn SerialApp_Send
*
* @brief Send data OTA.
*
* @param none
*
* @return none
*/
static void SerialApp_Send(void)
{
uint8 len=0, addr, FC;
uint8 checksum=0;
// HalUARTWrite(UART0, "send\r\n", 7);
#if SERIAL_APP_LOOPBACK
if (SerialApp_TxLen < SERIAL_APP_TX_MAX)
{
SerialApp_TxLen += HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+SerialApp_TxLen+1,
SERIAL_APP_TX_MAX-SerialApp_TxLen);
}
if (SerialApp_TxLen)
{
(void)SerialApp_TxAddr;
if (HalUARTWrite(SERIAL_APP_PORT, SerialApp_TxBuf+1, SerialApp_TxLen))
{
SerialApp_TxLen = 0;
}
else
{
osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT);
}
}
#else
if (!SerialApp_TxLen &&
(SerialApp_TxLen = HalUARTRead(UART0, SerialApp_TxBuf, SERIAL_APP_TX_MAX)))
{
if (SerialApp_TxLen>0)
{
SerialApp_TxLen = 0;
}
}
#endif
}
/*********************************************************************
* @fn SerialApp_Resp
*
* @brief Send data OTA.
*
* @param none
*
* @return none
*/
static void SerialApp_Resp(void)
{
if (afStatus_SUCCESS != AF_DataRequest(&SerialApp_RxAddr,
(endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID2,
SERIAL_APP_RSP_CNT, SerialApp_RspBuf,
&SerialApp_MsgID, 0, AF_DEFAULT_RADIUS))
{
osal_set_event(SerialApp_TaskID, SERIALAPP_RESP_EVT);
}
}
/*********************************************************************
* @fn SerialApp_CallBack
*
* @brief Send data OTA.
*
* @param port - UART port.
* @param event - the UART port event flag.
*
* @return none
*/
static void SerialApp_CallBack(uint8 port, uint8 event)
{
(void)port;
if ((event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)) &&
#if SERIAL_APP_LOOPBACK
(SerialApp_TxLen < SERIAL_APP_TX_MAX))
#else
!SerialApp_TxLen)
#endif
{
SerialApp_Send();
}
}
//LCD和串口显示RFID信息
void PrintfRfidCard(uint8* data, int len)
{
char card_buff[20]={0};
card_buff[0]='I';
card_buff[1]='D';
card_buff[2]=':';
for(int i=0; i<4; i++)
{
unsigned char temp= data[2+i];
card_buff[3+i*2]=NumberToLetter((temp>>4)&0x0f);
card_buff[3+i*2+1]=NumberToLetter(temp&0x0f);
}
HalLcdWriteString( card_buff, HAL_LCD_LINE_3 );
// HalUARTWrite (UART0, (uint8 *)card_buff, strlen(card_buff));
}
void SerialApp_SendPeriodicMessage( void )
{
#if defined(ZDO_COORDINATOR)
#else
uint8 SendBuf[10]={0};
uint8 error=0;
//寻卡命令
RevBuffer[0]=0x02;
RevBuffer[1]=0x26;
// 寻卡
iccardcode();
if(RevBuffer[1]==0)//寻卡成功
{
//读卡命令
SendBuf[0]=RevBuffer[2]; //data
SendBuf[1]=RevBuffer[3]; //data
//找到卡
//读卡
RevBuffer[0]=0x03;
iccardcode();
if(RevBuffer[1]==0)
{
//读卡成功
//记录卡ID
SendBuf[2]=RevBuffer[2]; //data
SendBuf[3]=RevBuffer[3]; //data
SendBuf[4]=RevBuffer[4]; //data
SendBuf[5]=RevBuffer[5]; //data
}
else
{
error=1;
}
}
else
{
error=1;
}
if(error>0)
{
uint8 txbuf[1];
//txbuf[0]=1;
txbuf[0]=2;
HalLcdWriteString( "Nothing or error", HAL_LCD_LINE_3 );
if ( AF_DataRequest( &SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID,
1,
txbuf,
&SerialApp_MsgID,
0,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
// Successfully requested to be sent.
}
else
{
// Error occurred in request to send.
}
}
else
{
uint8 txbuf[2];
//输出显示
PrintfRfidCard(SendBuf, 6);
// txbuf[1] = 1;
txbuf[1] = 2;
//发送给协调器
if ( AF_DataRequest( &SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID,
2,
txbuf,
&SerialApp_MsgID,
0,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
// Successfully requested to be sent.
}
else
{
// Error occurred in request to send.
}
}
#endif
// SerialApp_SendData_Lamp(ZIGBEE_FUN_CODE_CHECK_LAMP);
}
//通过串口输出短地址 IEEE
void PrintAddrInfo(uint16 shortAddr, uint8 *pIeeeAddr)
{
uint8 strIeeeAddr[17] = {0};
char buff[30] = {0};
//获得短地址
sprintf(buff, "shortAddr:%04X IEEE:", shortAddr);
//获得IEEE地址
GetIeeeAddr(pIeeeAddr, strIeeeAddr);
HalUARTWrite (UART0, (uint8 *)buff, strlen(buff));
Delay_ms(10);
HalUARTWrite (UART0, strIeeeAddr, 16);
HalUARTWrite (UART0, "\n", 1);
}
void AfSendAddrInfo(void)
{
uint16 shortAddr;
uint8 strBuf[11]={0};
SerialApp_TxAddr.addrMode = (afAddrMode_t)Addr16Bit;
SerialApp_TxAddr.endPoint = SERIALAPP_ENDPOINT;
SerialApp_TxAddr.addr.shortAddr = 0x00;
shortAddr=NLME_GetShortAddr();
strBuf[0] = 0x3B; //发送地址给协调器 可用于点播
strBuf[1] = HI_UINT16( shortAddr ); //存放短地址高8位
strBuf[2] = LO_UINT16( shortAddr ); //存放短地址低8位
osal_memcpy(&strBuf[3], NLME_GetExtAddr(), 8);
if ( AF_DataRequest( &SerialApp_TxAddr, (endPointDesc_t *)&SerialApp_epDesc,
SERIALAPP_CLUSTERID,
11,
strBuf,
&SerialApp_MsgID,
0,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
void GetIeeeAddr(uint8 * pIeeeAddr, uint8 *pStr)
{
uint8 i;
uint8 *xad = pIeeeAddr;
for (i = 0; i < Z_EXTADDR_LEN*2; xad--)
{
uint8 ch;
ch = (*xad >> 4) & 0x0F;
*pStr++ = ch + (( ch < 10 ) ? '0' : '7');
i++;
ch = *xad & 0x0F;
*pStr++ = ch + (( ch < 10 ) ? '0' : '7');
i++;
}
}
uint8 GetDataLen(uint8 fc)
{
uint8 len=0;
switch(fc)
{
case 0x0A:
case 0x0B:
case 0x0C:
case 0x0D:
len = 1;
break;
}
return len;
}
#if defined(ZDO_COORDINATOR)
#else
void iccardcode()
{
unsigned char cmd;
unsigned char status;
cmd = RevBuffer[0];
switch(cmd)
{
case 1: // Halt the card //终止卡的操作
status= PcdHalt();
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
// 寻卡,防冲突,选择卡 返回卡类型(2 bytes)+ 卡系列号(4 bytes)
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
}
RevBuffer[0]=3;
RevBuffer[1]=status;
break;
case 3: // 防冲突 读卡的系列号 MLastSelectedSnr
status = PcdAnticoll(&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
memcpy(MLastSelectedSnr,&RevBuffer[2],4);
RevBuffer[0]=5;
RevBuffer[1]=status;
break;
case 4: // 选择卡 Select Card
status=PcdSelect(MLastSelectedSnr);
if(status!=MI_OK)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
RevBuffer[0]=3;
RevBuffer[1]=status;
break;
case 5: // Key loading into the MF RC500's EEPROM
status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 6:
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 7:
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 8: // Read the mifare card
// 读卡
status=PcdRead(RevBuffer[1],&RevBuffer[2]);
if(status==0)
{RevBuffer[0]=17;}
else
{RevBuffer[0]=1;}
RevBuffer[1]=status;
break;
case 9: // Write the mifare card
// 写卡 下载密码
status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 10:
PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 12: // 参数设置
PcdBakValue(RevBuffer[1], RevBuffer[2]);
RevBuffer[0]=1;//contact
RevBuffer[1]=0;
break;
}
}
#endif
有时间对代码再仔细整理