基于RFID和CAN总线的井下人员定位系统的研究

基于RFID和CAN总线的井下人员定位系统的研究

基于RFID和CAN总线的井下人员定位系统的研究

  • 适用:本科,大专,自考
  • 更新时间2024年
  • 原价: ¥292
  • 活动价: ¥200 (活动截止日期:2024-04-29)
  • (到期后自动恢复原价)
基于RFID和CAN总线的井下人员定位系统的研究

 基于RFID和CAN总线的井下人员定位系统的研究

摘    要
我国的矿山数量多,分布广,在国民经济发展中占有非常重要的位置。但由于自身的特点,矿山企业发生各种灾害和人身伤亡事故的几率较高,一直是我国安全生产工作的重点。由于煤矿生产环境的特殊性,井下人员的分布不能快速真实地反映在地面管理系统中。在正常生产期间,不能方便地统计井下工作人员的数量和分布;一旦发生事故,不能很快了解井下人员的数量、分布和位置,给救灾工作带来困难。
本报告首先分析了国内外井下人员定位技术的发展现状,并比较了其中的优缺点。分析了系统的工作原理,并进行了功能划分。系统在设计过程中采用了模块化思想,从三个子系统分别对系统进行设计。报告中重点研究了井下的无线通信问题,并选择了RFID(射频识别)为井下无线通信方案;在井下与地面的通信方式中选择了技术先进、性能可靠的CAN总线技术;在地面监控端结合当前的新技术采用了GIS(地理信息系统)进行井下监控情况的实时显示。
 
关键字:井下人员定位;RFID;CAN;GIS
 
 
 
 
 
 
 
 
 
 
 
 
Abstract
China's mines are numerous and widely distributed, and occupy a very important position in the development of national economy. However, due to its own characteristics, mining enterprises have a higher probability of disasters and casualties, which has always been the focus of China's work safety. Because of the particularity of coal mine production environment, the distribution of underground personnel can not be quickly and truly reflected in the ground management system. During the normal production period, the number and distribution of underground workers can not be conveniently counted; in the event of accidents, the number, distribution and position of the downhole personnel can not be quickly understood, which brings difficulties to the disaster relief work.
This report first analyzes the development status of underground personnel positioning technology at home and abroad, and compares the advantages and disadvantages of them. The working principle of the system is analyzed and function partition is carried out. In the design process, the system adopts modularization idea and designs the system from three subsystems. The report focuses on the problem of wireless communication in the underground, and chooses the RFID (radio frequency identification) as the downhole wireless communication scheme, and selects the advanced technology and reliable CAN bus technology in the communication between the underground and the ground, and uses the GIS (Geographic Information System) to carry out the well in the ground monitoring end with the current new technology. The real-time display of the monitoring situation.
 
Keywords: downhole personnel positioning; RFID; CAN; GIS
 
 
 
 
 
 
 
 
 
 
目录
第一章 概述 1
第二章 无线传感网络无线网络与定位系统简介 2
2.1 无线传感网络介绍 2
2.1.1 什么是无线传感网络 2
2.1.2 无线传感网络网络拓扑结构 2
2.1.3 无线传感网络2006协议栈介绍 2
2.1.4 无线传感网络的特点 3
2.1.5 无线传感网络的应用范围 4
2.2 无线传感网络和现有无线技术的比较 5
2.2.1 无线传感网络和现有移动网(GPRS,CDMA-1X)的比较 5
2.2.2 无线传感网络与现有数传电台的比较 6
2.2.3 无线传感网络与蓝牙的比较 6
2.2.4 无线传感网络与RFID的比较 8
第三章 系统方案设计 10
3.1 系统组成 10
1) 上位机 10
2) 网关 10
3) 参考节点 10
4) 定位节点 10
3.2 系统工作原理 11
3.3 系统定位过程 11
3.3.1 被动定位过程 11
3.3.2 主动定位过程 11
 4 井下无线通信子系统设计 13
4.1 通信的基本知识 13
4.2 井下人员定位系统无线通信解决方案及对比 15
4.3 无线通信方案的确定 18
4.4 无线通信子系统的硬件设计 18
4.5 无线通信子系统的软件设计 39
 5 井下与地面通信子系统设计 48
5.1 通信方案及比较 48
5.2 CAN总线 51
5.3 CAN总线接口电路设计 52
5.4 CAN总线接口电路软件设计 1
6.1 使用的软件 3
6.2 调试开发过程及截图 3
7. 技术路线与关键技术 10
7.1 具体实施的技术路线 10
7.1.1 无线传感网络2006协议栈验证 10
7.1.2 建立单个无线传感网络网络 10
7.1.3 多无线传感网络网络与上位机通信实现 10
7.1.4 多无线传感网络网络定位实现 10
7.1.5 上位机软件设计与系统联调 10
7.1.6 现场测试与系统完善 11
7.2 系统设计中的难点 11
7.2.1 无线传感网络网络调试比较困难 11
7.2.2 定位节点的跨网络管理 11
7.3 系统设计中的关键技术 11
7.3.1 直接序列扩频技术RFID 11
7.3.2 动态组网 11
7.3.3 低功耗设计 11
 总结 13
致    谢 14
参 考 文 献 15
附录  部分程序 16
 
第一章概述
随着社会对煤炭需求量的不断增大,近年来我国煤矿事故又有攀升趋势,煤矿安全状况令人担忧。国家安全生产监督管理总局曾要求05年年底以前,高瓦斯、煤与瓦斯突出煤矿要全部建立并完善安全监测监控系统。
煤矿矿井井下环境十分恶劣,它在空间上非常有限,空气质量较差,瓦斯气体随时可能引发爆炸危险,特别是在发生事故时,人员的疏散逃离和救援工作十分有限,迫切需要改善。对井下人员实现定位跟踪,就是一种十分有效的解决办法。
然而井下人员的跟踪定位技术,国内外目前仍然是一个空白领域,国内目前所使用的井下人员跟踪技术,实际上仅仅是一种考勤记录系统,而非真正的人员定位跟踪系统,无法实时地报告井下人员的具体位置,而煤矿安全事故是频有发生,在人员和财产上造成了很大的损失。本课题研究正是针对这一问题而展开的。课题研究的主要目标是实现矿井井下人员及设备的定位,从而为煤矿业平常的监控管理和人员救援提供有效的相关定位信息。
本设计基于无线传感网络技术,利用无线传感网络无线网络,借助无线传感网络设备的定位功能,实现可靠的,精确的定位。系统分为井下和地面两个部分。井下主要由无线传感网络网络构成,通过网关,将数据汇集向地面传送。在地面有由工控机构成的监管系统,从而实现对整个地下工作人员及设备的实时定位跟踪。
本文依次介绍了无线传感网络的技术特点,无线传感网络相对其它相关技术的优势,系统硬件设计,软件设计,系统的调试,设计中的难点和涉及的关键技术等,最后总结了设计的进展情况和所取得的成果。说明,本论文中所涉及到的网关即协调器,盲节点即定位节点或者目标节点,短地址即网络地址,长地址即扩展地址,论文中涉及到这些名词就不再做说明。
第二章无线传感网络无线网络与定位系统简介
2.1无线传感网络介绍
2.1.1什么是无线传感网络
无线传感网络是IEEE 802.15.4协议的代名词。根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。其特点是近距离、低复杂度、低功耗、低数据速率、低成本。主要适合用于自动控制和远程控制领域,可以嵌入各种设备[5]。
简而言之,无线传感网络就是一种便宜的,低功耗的近距离无线组网通讯技术。
参 考 文 献
[1] CC2431 Location Engine[EB/OL].http://www.ti.com.
[2] CC2431 System-on-Chip for 2.4GHz 无线传感网络/IEEE 802.15.4 with Location Engine[EB/OL]. http://www.ti.com.
[3] 无线传感网络 Specification 2006[EB/OL].http://www.无线传感网络.org.
[4] 8051 IAR Embedded Workbench Help[EB/OL].http://www.iar.com.
[5] 蒋挺,赵成林等.紫蜂技术及其应用[M].北京:北京邮电学院出版社,2006.
[6] 李文仲,段朝玉等.无线传感网络2006无线网络与无线定位实战[M].北京:北京航空航天大学出版社,2008.
[7] TheodoreS, Ramjee.无线通信原理与应用[M].北京:电子工业出版社,1999.
[8] 无线传感网络技术在煤矿井下救援系统中的应用[EB/OL].http://www.ccmsn.cn.
[9] 郭兵.SOC技术原理应用[M].北京:清华大学出版社,2006.
[10] Amre E1 - Hoiydi, Jean - Dominique Decotignie. "Low Power Downlink MAC Protocols for Infrastructure Wireless Sensor Networks ". Mobil Networks and Applications, 2005.
[11] 王士林等.现代数字调制技术[M].北京:人民邮电出版社,1987.
附录  部分程序
嵌入式上位机WinCE关键程序:通信数年处理:
/*********************************************************************
 * 名 称: ZBDataProcessCB
 * 功    能: 
 * 入口参数: (BYTE *data, DWORD nDataCount, void *context)
 * 出口参数: 无
 * 作    者: XXX
 * 日    期: 2016年5月份
*********************************************************************/
 void ZBLocMainDlg::ZBDataProcessCB(BYTE *buf, DWORD nDataCount, void *context)
 { ZBLocMainDlg *pDlg = (ZBLocMainDlg *)context;
/***********************************************
*Description: 对接收到的数据进行处理 :2008-12-29
*/
MSGPkt.qMsgIsDealing = TRUE; // 置数据处理中标志位,防止
//串口接收回调函数重启该进程
int len;
DWORD cmd;
/***********************************************
*Description: 判断队列中是否还有消息要处理,如果头尾计数器不相等则表示有可用数据)
*/
while( MSGPkt.qTail != MSGPkt.qHead ) 
{ int msgLen; // 用于存储消息长度
int unReadedMsgLen; // 用于存储未读消息长度
INT8U *pBuf; // 定义指向缓冲区数据的指针
INT8U *pkt; // 定义指向定位信息帧帧头的指针
pBuf = & LocMsgBuf [MSGPkt.qTail][2];  // 接收当前缓冲区队列中的消息
if( MSGPkt.qTail++ == LOC_DAT_Q_SIZE )    // 如果队尾加到队列的最大值,则:
MSGPkt.qTail = 0; // 使队尾跳到队头
/**********************************************
*Description: 读取当前数据缓冲区队列的数据长度
* 长度为该缓冲区的头两个字节:第一个字节为长度低8位;第二个字节为高8位
*/
msgLen =BUILD_INT16U(LocMsgBuf[MSGPkt.qTail][0],LocMsgBuf [MSGPkt.qTail][1]);
unReadedMsgLen = msgLen; // 未读之前,未读消息长度==信息长度
/**********************************************
*Description: 从当前缓冲区中解析出定位命令
* 如果当前缓冲区中只有一帧通过校验数据,则执行完就检测下一个缓冲区
* 如果当前缓冲区中不止一帧数据,则执行完后继续搜索下一帧数据,
* 只到unReadedMsgLen == 0即数据读完
*/
again: while( unReadedMsgLen > 0 )
{ if( *pBuf == 0x02 ) // 如果是数据帧头,则:
{if( TRUE == RecDataChk( (char *)pBuf, &unReadedMsgLen ) )// 对数据进行校验 { pkt = pBuf; // 获得信息帧头指针以进行后面的处理
if( unReadedMsgLen > 0 ) // 如果数据未读完,则:
{ // 数据指针指针未读完的第一个数据
pBuf += msgLen - unReadedMsgLen; msgLen = unReadedMsgLen; // 同时改变数据的长度
} // 校验通过,获得命令,进行后面的数据处理
cmd = BUILD_INT16U( pkt[CMD_LO_IDX], pkt[CMD_HI_IDX] ); }
else // 如果当前数据不是帧头,则:
{ if( unReadedMsgLen > 0 ) // 如果数据未读完,则:
{pBuf += msgLen - unReadedMsgLen; //指向未读完的数据的第一个数据
msgLen = unReadedMsgLen; // 同时改变数据的长度
goto again; // 返回,重新读取数据
}
break; // 没有数据直接跳出
}
}
else if( unReadedMsgLen > 0 ) // 不是帧头,且数据未读完,则:
{ pBuf++; // 数据指针指向下一个数据
msgLen--; // 数据长度减1
unReadedMsgLen--; // 未读数据长度减1
goto again; // 返回,重新读取数据
}
else break; // 没有有用信息,直接跳出去接收下一个缓冲区的数据
/**********************************************
*Description: 获得命令,并对不同的命令做出不同的响应
*/
switch( cmd )
{/************************************************
*Discription: 接收系统命令响应system command response 
*/
case SPI_CB_SYS_RESET_RSP: //0x1005
pDlg->SetInifBarInfo(_T("网关复位成功!") );
case SPI_CB_SYS_PING_RSP: //0x1007
{ pDlg->SetInifBarInfo(_T("网关ping成功!") );
len = 5;
pDlg->m_SerialPortComZB.WriteCom((UCHAR*)SYS_GET_DEVICE_INFO, len);
MSGPkt.sysStatus = CONNECTED;
MSGPkt.timeOut = 10;
}break;
 
case SPI_CB_SYS_GET_DEVICE_INFO_RSP: //0x1014
{ pDlg->SetInifBarInfo(_T("网关地址:") );
MSGPkt.sysCmd = LOCATION_REFNODE_REQUEST_CONFIG;
}break;
/************************************************
*Discription: 接收系统应用层消息
*/
case SPI_RESPONSE_BIT | SPI_CMD_SYS_APP_MSG: // 系统命令
{ MSGPkt.srcAddr=BUILD_INT16U(pkt[SRC_ADDR_LO_IDX],pkt[SRC_ADDR_HI_IDX] );
if( MSGPkt.srcAddr >= 0xfffe ) break; // 地址过滤
RefNodeList pRef = new RefNode_t; // 动态分配存储空间 BlindNodeMsgList pBlindMsg = new BlindNodeMsg_t;
BlindNodeCfgList pBlindCfg = new BlindNodeCfg_t;
RefNodeList pTempRef;
BlindNodeMsgList pTempBlindMsg;
BlindNodeCfgList pTempBlindCfg;
int idx;
CString str = "";
POSITION pos;
BOOL STORAGE_FLAG= FALSE;
// DstEP + SrcAddr + SrcEP + cId + len = 1+2+1+2+1
MSGPkt.dstEp = pkt[DST_ENDPOINT_IDX];
MSGPkt.srcEp = pkt[SRC_ENDPOINT_IDX];
MSGPkt.clusterId = BUILD_INT16U( pkt[CID_LO_IDX],pkt[CID_HI_IDX]);// 簇号
MSGPkt.cmd.DataLength= pkt[DATA_LEN_IDX]; // 数据帧长度
MSGPkt.cmd.Data = (INT8U *)&pkt[MSG_DATA_BASE_IDX];// 数据指针
/************************************************
*Description: 分类接收数据
*/
switch( MSGPkt.clusterId )
{
/************************************************
*Discription: 接收RSSI应答0x0012
*/
/**************/case LOCATION_XY_RSSI_REQUEST: //0x0011
break;
/**************/case LOCATION_XY_RSSI_RESPONSE: //0x0012
pRef->addr.addr = MSGPkt.srcAddr;
pRef->cfg.x = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[LOCATION_XY_RSSI_X_LO_IDX],MSGPkt.cmd.Data[LOCATION_XY_RSSI_X_HI_IDX]));
pRef->cfg.y = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[LOCATION_XY_RSSI_Y_LO_IDX],MSGPkt.cmd.Data[LOCATION_XY_RSSI_Y_HI_IDX]));
pRef->msg.rssi = MSGPkt.cmd.Data[LOCATION_XY_RSSI_RSSI_IDX];
pRef->cfg.timeOut = refTimeOut;
break;
/************************************************
*Discription: 接收参考节点配置应答0x0015
*/
/***************/case LOCATION_REFNODE_CONFIG: //0x0015
pRef->addr.addr = MSGPkt.srcAddr;
pRef->cfg.x = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[REFNODE_CONFIG_X_LO_IDX],MSGPkt.cmd.Data[REFNODE_CONFIG_X_HI_IDX]));
pRef->cfg.y = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[REFNODE_CONFIG_Y_LO_IDX],MSGPkt.cmd.Data[REFNODE_CONFIG_Y_HI_IDX]));
pRef->cfg.timeOut = refTimeOut;
//pRef->cfg.flag = TIMEOUT_STOP;
break;
/************************************************
*Discription: 接收参考节点配置请求0x0017
*/
/***************/case LOCATION_REFNODE_REQUEST_CONFIG: //0x0017
pRef->addr.addr = MSGPkt.srcAddr;
pRef->cfg.x = REF_DEFAULT_X;
pRef->cfg.y = REF_DEFAULT_Y;
pRef->cfg.timeOut = refTimeOut;
break;
 
/************************************************
*Discription: 接收盲节点发现请求0x0013
*/
/**************/case LOCATION_BLINDNODE_FIND_REQUEST: //0x0013
break;
/************************************************
*Discription: 接收盲节点发现应答0x0014
*/
/**************/case LOCATION_BLINDNODE_FIND_RESPONSE: //0x0014
pBlindMsg->addr.addr = MSGPkt.srcAddr;
pBlindMsg->msg.status = MSGPkt.cmd.Data[BLINDNODE_RESPONSE_STATUS_IDX];
pBlindMsg->msg.x = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_RESPONSE_X_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_RESPONSE_X_HI_IDX]));
pBlindMsg->msg.y = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_RESPONSE_Y_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_RESPONSE_Y_HI_IDX]));
pBlindMsg->msg.refNodes = MSGPkt.cmd.Data[BLINDNODE_RESPONSE_NUMREFNODES_IDX];
pBlindMsg->msg.nextAddr = BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_RESPONSE_REF_SHORTADDR_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_RESPONSE_REF_SHORTADDR_HI_IDX]);
pBlindMsg->msg.nextX = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_RESPONSE_REF_X_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_RESPONSE_REF_X_HI_IDX]));
pBlindMsg->msg.nextY = INT16UToFloat(BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_RESPONSE_REF_Y_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_RESPONSE_REF_Y_HI_IDX]));
pBlindMsg->msg.rssi = MSGPkt.cmd.Data[BLINDNODE_RESPONSE_REF_RSSI];
pBlindCfg->cfg.timeOut = blindTimeOut;
pBlindMsg->msg.timeOut = blindTimeOut;
//pBlindMsg->msg.temp = MSGPkt.cmd.Data[BLINDNODE_RESPONSE_TEMP_IDX];
//pBlindMsg->msg.bat = MSGPkt.cmd.Data[BLINDNODE_RESPONSE_BATT_IDX];
break;
/************************************************
*Discription: 接收盲节点配置应答0x0016
*/
/**************/case LOCATION_BLINDNODE_CONFIG: //0x0016
pBlindCfg->addr.addr = MSGPkt.srcAddr;
pBlindCfg->cfg.param_a =
MSGPkt.cmd.Data[BLINDNODE_CONFIG_A_IDX];
pBlindCfg->cfg.param_n = MSGPkt.cmd.Data[BLINDNODE_CONFIG_N_IDX];
pBlindCfg->cfg.mode = MSGPkt.cmd.Data[BLINDNODE_CONFIG_MODE_IDX];
pBlindCfg->cfg.cllectTime = BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_CONFIG_COLLECT_TIME_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_CONFIG_COLLECT_TIME_HI_IDX]);
pBlindCfg->cfg.cycleTime = BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_CONFIG_CYCLE_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_CONFIG_CYCLE_HI_IDX]);
pBlindCfg->cfg.dstAddr = BUILD_INT16U( MSGPkt.cmd.Data[BLINDNODE_CONFIG_REPORT_SADDR_LO_IDX],MSGPkt.cmd.Data[BLINDNODE_CONFIG_REPORT_SADDR_HI_IDX]);
pBlindCfg->cfg.dstEp = MSGPkt.cmd.Data[BLINDNODE_CONFIG_REPORT_EP_IDX];
pBlindCfg->cfg.minRefNodes  = MSGPkt.cmd.Data[BLINDNODE_CONFIG_MIN_REFNODES_IDX];
pBlindCfg->cfg.timeOut = blindTimeOut;
//pBlindCfg->cfg.flag = TIMEOUT_STOP;
pBlindMsg->msg.timeOut = blindTimeOut;
break;
/************************************************
*Discription: 接收盲节点配置请求0x0018
*/
/**************/case LOCATION_BLINDNODE_REQUEST_CONFIG: //0x0018
pBlindCfg->addr.addr = MSGPkt.srcAddr;
pBlindCfg->cfg.param_a = BLIND_DEFAULT_PARAM_A;
pBlindCfg->cfg.param_n = BLIND_DEFAULT_PARAM_N;
pBlindCfg->cfg.mode = BLIND_DEFAULT_MODE;
pBlindCfg->cfg.cllectTime = BLIND_DEFAULT_CLLECTTIME;
pBlindCfg->cfg.cycleTime = BLIND_DEFAULT_CYCLETIME;
pBlindCfg->cfg.dstAddr = BLIND_DEFAULT_DST_ADDR;
pBlindCfg->cfg.dstEp = BLIND_DEFAULT_DST_EP;
pBlindCfg->cfg.minRefNodes = BLIND_DEFAULT_MIN_REF_NODES;
pBlindCfg->cfg.timeOut = blindTimeOut;
pBlindMsg->msg.timeOut = blindTimeOut;
break;
/************************************************
*Discription: 接收温度应答0x0022
*/
/**************/case LOCATION_TEMP_RESPONSE:
break;
/************************************************
*Discription: 接收电池电压应答0x0024
*/
/**************/case LOCATION_BATT_RESPONSE:
break;
default:
break;
} /* switch( MSGPkt.clusterId ) */
/************************************************
*Discription: 分类存储及更新数据
*/
switch( MSGPkt.clusterId )
{/************************************************
*Discription: 接收RSSI应答0x0012
*/
/**************/case LOCATION_XY_RSSI_REQUEST: //0x0011
/**************/case LOCATION_XY_RSSI_RESPONSE: //0x0012
/************************************************
*Discription: 接收参考节点配置应答0x0015
*/
/**************/case LOCATION_REFNODE_CONFIG: //0x0015
/************************************************
*Discription: 接收参考节点配置请求0x0017
*/
/**************/case LOCATION_REFNODE_REQUEST_CONFIG: //0x0017
#if DISP_HEX_EN > 0
str += HexToStr( 4,pRef->addr.addr );
#else
str += DecToStr( 5,pRef->addr.addr );
#endif
/***********************************************
*Discription: 创建参考节点存储链表并在列表中显示,added by scw
*获得由pos标志的列表元素,然后设置pos 
*为列表下一个入口的POSITION值。如果用GetHeadPosition
*或Find调用建立初始位置,你可使用向前遍历循环的GetNext。
*必须保证你的POSITION值代表列表中的一个有效位置。
*如果无效,则插入MFC库的调试版本断言。
*如果获取的元素是列表中最后一个,那么pos的新值设置为NULL。
*/
if( !m_RefNodeList.IsEmpty() ) // 判断是否为空链表,如果不为空则:
{ pos = m_RefNodeList.GetHeadPosition(); // 获得头的位置
for( idx = 0; pos != NULL; idx++ )
{ /***********************************************
*得到pos上的值,同时pos指向下一下元素, 
*如果下个元素为空,则pos为NULL
*/
pTempRef = m_RefNodeList.GetNext( pos ); if ( pTempRef->addr.addr == pRef->addr.addr )
{ STORAGE_FLAG = FALSE;
break;
}
else
{   STORAGE_FLAG = TRUE; }
}
}
/***********************************************
*Discription: 判断节点是否已经存在,不存在则插入,added by scw
*/
else
{ STORAGE_FLAG = TRUE; }
/***********************************************
*Discription: 存储数据
*/
if( STORAGE_FLAG == TRUE )
{ idx = m_RefNodeList.GetCount(); // 得到链表中的节点数
m_RefNodeList.AddTail( pRef ); // 从尾部添加
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST2))->InsertItem(LVIF_TEXT|LVIF_STATE, idx, str, 0, LVIS_SELECTED,0, 0);
}
/***********************************************v
*Discription: 更新存储数据并更新显示,added by scw
*/
else
{ pos = m_RefNodeList.FindIndex( idx );// 根据条目号获得存储位置
ASSERT(pos);
pTempRef= m_RefNodeList.GetAt( pos );// 根据存储位置获得指针
if( pTempRef->cfg.flag )
pRef->cfg.flag = TIMEOUT_STOP;
else
pRef->cfg.flag = TIMEOUT_CLR;
m_RefNodeList.SetAt( pos, pRef );  // 更新替换数据
 
pDlg->m_CurveArea.scw_RemoveDrawedNode(pTempRef->cfg.x, pTempRef->cfg.y);
pDlg->m_CurveArea.scw_DrawRef( pRef->cfg.x,pRef->cfg.y,pRef->addr.addr);
pRef = pTempRef;  // 指向要释放的内存
}
/***********************************************
*Discription: 更新显示
*/
if( MSGPkt.clusterId == LOCATION_REFNODE_REQUEST_CONFIG )
str = "新加";
else
str = "正常";
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST2))->SetItemText(idx,1,str);
//str.Format(_T("%d"), pRef->msg.rssi);
//((CListCtrl *)pDlg->GetDlgItem(IDC_LIST2))->SetItemText(idx,2,str);
str.Format(_T("%.2f"), pRef->cfg.x);
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST2))->SetItemText(idx,2,str);
str.Format(_T("%.2f"), pRef->cfg.y);
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST2))->SetItemText(idx,3,str);
if( STORAGE_FLAG == TRUE )
{ pDlg->m_CurveArea.AutoZoon(); // 自动搜索合适的显示区域
pDlg->m_SliderzoonSize.SetPos(zoonSize-1); // 更新滑动条
// 通过产生一个鼠标点击事件来刷新显示区域
pDlg->MouseClick(CurveAreaWidth,CurveAreaHight); pDlg->m_CurveArea.scw_DrawRef( pRef->cfg.x,pRef->cfg.y,pRef->addr.addr);
}
break;
/************************************************
*Discription: 接收盲节点发现应答0x0014
*/
/**************/case LOCATION_BLINDNODE_FIND_RESPONSE: //0x0014
#if DISP_HEX_EN > 0
str += HexToStr( 4,pBlindMsg->addr.addr );
#else
str += DecToStr( 5,pBlindMsg->addr.addr );
#endif
if( !m_BlindNodeMsgList.IsEmpty() )
{ pos = m_BlindNodeMsgList.GetHeadPosition(); // 获得头的位置
for( idx = 0; pos != NULL; idx++ )
{ pTempBlindMsg = m_BlindNodeMsgList.GetNext( pos ); f(pTempBlindMsg->addr.addr == pBlindMsg->addr.addr )
{ STORAGE_FLAG = FALSE;
break;
}
else
{   STORAGE_FLAG = TRUE; }
}
}
/***********************************************
*Discription: 判断节点是否已经存在,不存在则插入,added by scw
*/
else
{ STORAGE_FLAG = TRUE; }
/***********************************************
*Discription: 存储数据
*/
if( STORAGE_FLAG == TRUE )
{ idx = m_BlindNodeMsgList.GetCount(); // 得到目前已有的红点数
m_BlindNodeMsgList.AddTail( pBlindMsg ); // 从尾部插入
{ pBlindCfg->addr.addr= pBlindMsg->addr.addr;// 用相同的地址
pBlindCfg->cfg.param_a = BLIND_DEFAULT_PARAM_A;
pBlindCfg->cfg.param_n = BLIND_DEFAULT_PARAM_N;
pBlindCfg->cfg.mode = BLIND_DEFAULT_MODE;
pBlindCfg->cfg.cllectTime = BLIND_DEFAULT_CLLECTTIME; pBlindCfg->cfg.cycleTime = BLIND_DEFAULT_CYCLETIME;
pBlindCfg->cfg.dstAddr = BLIND_DEFAULT_DST_ADDR;
pBlindCfg->cfg.dstEp = BLIND_DEFAULT_DST_EP; pBlindCfg->cfg.minRefNodes=BLIND_DEFAULT_MIN_REF_NODES;
}
m_BlindNodeCfgList.AddTail( pBlindCfg ); // 同时入配置节点
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST1))->
InsertItem(LVIF_TEXT|LVIF_STATE, idx, str, 0, LVIS_SELECTED,0, 0);
CString str2 = "发现目标:" + str;
pDlg->SetStatusBarInfo(str2);
}
/***********************************************
*Discription: 更新存储数据并更新显示,added by scw
*/
else
{ /***********************************************
*Discription: 查找要更新的条目号,added by scw
*/
pos=m_BlindNodeMsgList.FindIndex(idx);//根据条目号获得存储位置
ASSERT(pos); // 根据存储位置获得节点指针
pTempBlindMsg = m_BlindNodeMsgList.GetAt( pos ); 
m_BlindNodeMsgList.SetAt( pos, pBlindMsg ); // 更新替换数据 pDlg->m_CurveArea.scw_RemoveDrawedNode(pTempBlindMsg->msg.x, pTempBlindMsg->msg.y);
pDlg->m_CurveArea.scw_DrawBlind( pBlindMsg->msg.x, pBlindMsg->msg.y, pBlindMsg->addr.addr );
pBlindMsg = pTempBlindMsg; // 指向要释放的内存
}
/***********************************************
*Discription: 更新显示
*/
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST1))->SetItemText(idx,1,L"正常");
str.Format(_T("%d"), pBlindMsg->msg.rssi);
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST1))->SetItemText(idx,2,str);
str.Format(_T("%.2f"), pBlindMsg->msg.x);
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST1))->SetItemText(idx,3,str);
str.Format(_T("%.2f"), pBlindMsg->msg.y);
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST1))->SetItemText(idx,4,str);
if( STORAGE_FLAG == TRUE )
pDlg->m_CurveArea.scw_DrawBlind( pBlindMsg->msg.x, pBlindMsg->msg.y, pBlindMsg->addr.addr );
break;
/**************/case LOCATION_BLINDNODE_FIND_REQUEST: //0x0013
/************************************************
*Discription: 接收盲节点配置应答0x0016
*/
/**************/case LOCATION_BLINDNODE_CONFIG: //0x0016
/************************************************
*Discription: 接收盲节点配置请求0x0018
*/
/**************/case LOCATION_BLINDNODE_REQUEST_CONFIG: //0x0018
#if DISP_HEX_EN > 0
str += HexToStr( 4,pBlindCfg->addr.addr );
#else
str += DecToStr( 5,pBlindCfg->addr.addr );
#endif
if( !m_BlindNodeCfgList.IsEmpty() )
{ pos = m_BlindNodeCfgList.GetHeadPosition(); // 获得头的位置
for( idx = 0; pos != NULL; idx++ )
{ pTempBlindCfg = m_BlindNodeCfgList.GetNext( pos ); if ( pTempBlindCfg->addr.addr == pBlindCfg->addr.addr )
{ STORAGE_FLAG = FALSE;
break;
}
else
{   STORAGE_FLAG = TRUE; }
}
}
/***********************************************
*Discription: 判断节点是否已经存在,不存在则插入,added by scw
*/
else
{ STORAGE_FLAG = TRUE; }
/***********************************************
*Discription: 存储数据
*/
if( STORAGE_FLAG == TRUE )
{ idx = m_BlindNodeCfgList.GetCount(); // 得到目前已有的红点数
m_BlindNodeCfgList.AddTail( pBlindCfg ); // 从尾部插入
pBlindMsg->addr.addr = pBlindCfg->addr.addr; // 用相同的地址
m_BlindNodeMsgList.AddTail( pBlindMsg ); // 同时入配置节点
((CListCtrl*)pDlg->GetDlgItem(IDC_LIST1))->
InsertItem(LVIF_TEXT|LVIF_STATE, idx, str, 0, LVIS_SELECTED,0, 0);
CString str2 = "发现目标:" + str;
pDlg->SetStatusBarInfo(str2);
}
/***********************************************
*Discription: 更新存储数据并更新显示,added by scw
*/
else
{ /***********************************************
*Discription: 查找要更新的条目号,added by scw
*/
pos = m_BlindNodeCfgList.FindIndex(idx);//根据条目号获得存储位置
ASSERT(pos);
pTempBlindCfg = m_BlindNodeCfgList.GetAt( pos ); // 获得节点指针
if( pTempBlindCfg->cfg.flag )
pBlindCfg->cfg.flag = TIMEOUT_STOP;
else
pBlindCfg->cfg.flag = TIMEOUT_CLR;
m_BlindNodeCfgList.SetAt( pos, pBlindCfg );
pBlindCfg = pTempBlindCfg; // 指向要释放的内存
}
/***********************************************
*Discription: 更新显示
*/
if( MSGPkt.clusterId == LOCATION_BLINDNODE_REQUEST_CONFIG )
str = "新加";
else
str = "正常";
((CListCtrl *)pDlg->GetDlgItem(IDC_LIST1))->SetItemText(idx,1,str);
break;
default:
break;
}/* switch( MSGPkt.clusterId ) */
/************************************************
*Discription: 用来回收动态分配的内存 
*/
switch( MSGPkt.clusterId )
{
/************************************************
*Discription: 参考节点
*/
/**************/case LOCATION_XY_RSSI_REQUEST: //0x0011
/**************/case LOCATION_XY_RSSI_RESPONSE: //0x0012
/**************/case LOCATION_REFNODE_CONFIG: //0x0015
/**************/case LOCATION_REFNODE_REQUEST_CONFIG: //0x0017
if( STORAGE_FLAG == FALSE )
{ delete pRef;
}
delete pBlindMsg;
delete pBlindCfg;
break;
/************************************************
*Discription: 目标节点
*/
/**************/case LOCATION_BLINDNODE_FIND_REQUEST: //0x0013
/**************/case LOCATION_BLINDNODE_FIND_RESPONSE: //0x0014
/**************/case LOCATION_BLINDNODE_CONFIG: //0x0016
/**************/case LOCATION_BLINDNODE_REQUEST_CONFIG: //0x0018
if( STORAGE_FLAG == FALSE )
{ delete pBlindMsg;
delete pBlindCfg;
}
delete pRef;
break;
/************************************************
*Discription: 否则全部回收
*/
default:
delete pRef;
delete pBlindMsg;
delete pBlindCfg;
break;
} /* switch( MSGPkt.clusterId ) */
}break;
default:
break;
} /* switch( cmd ) */
} /* while( unReadedMsgLen > 0 ) */
} /* while(MSGPkt.qTail != MSGPkt.qHead) */
 
MSGPkt.qFlag = FALSE; // 数据缓冲中无可用数据
MSGPkt.qMsgIsDealing = FALSE; // 数据处理完毕
SuspendThread(pDlg->hZBDataDealThread); // 挂起ZB通信数据处理进程
}
  • 关键词 RFID CAN 总线 井下 人员 定位 研究
  • 上一篇:基于RFID固定资产管理系统设计与实现
  • 下一篇:基于RFID射频技术行李自动分拣系统设计
  • 暂无购买记录

    暂时没有评论

    真实

    多重认证,精挑细选的优质资源 优质老师。

    安全

    诚实交易,诚信为本。

    保密

    所有交易信息,都为您保密。

    专业

    10年专业经验,10年来帮助无数学子。