public bool isUpdateFrame(byte[] frame) { bool rv; byte order; byte[] data; insertData insdata; checkData ckdata; rv = true; order = 0; data = null; insdata = new insertData(); ckdata = new checkData(); //(2)解帧操作 if (!frameDecode(frame, ref data, ref order)) { rv = false; goto isUpdateFrame_EXIT; //解帧失败 } //(3)判断帧长 if (data.Length != Marshal.SizeOf(insdata) && data.Length != Marshal.SizeOf(ckdata)) { rv = false; goto isUpdateFrame_EXIT; //解帧失败 } isUpdateFrame_EXIT: return(rv); }
//====================================================================== //函数名称:updateRecv //函数返回:0:数据命令帧发送成功; // 1:解帧操作失败;2:当前更新发生错误,更新操作需重新开始; // 3:检查操作失败;4:其他未知指令 //参数说明:frame:终端返回的帧数据 //功能概要:数据命令帧发送至终端后,终端返回数据至frame。 // 解析frame数据来判断终端操作状态 //====================================================================== public int updateRecv(byte[] frame) { //(1)变量声明 int i; int rv; //返回值 byte order; byte[] data; ushort curframe; checkData ckdata; rv = 0; //返回值默认成功,为0 order = 0; data = null; curframe = 0; ckdata = new checkData(); //(2)解帧操作 if (!frameDecode(frame, ref data, ref order)) { rv = 1; goto updateRecv_EXIT; //解帧失败 } //(3)命令判断 switch (order) { case 1: //(3.1)终端数据接收成功 //获取返回的帧号 curframe = BitConverter.ToUInt16(data, 0); //修改发送标识 check[curframe] = 1; //数据发送成功 break; case 2: if (data.Length == Marshal.SizeOf(ckdata)) { //将byte数组解析为对应的检查帧结构体数据 ckdata = (checkData)bytesToStruct(data, typeof(checkData)); //根据终端返回的未接收帧号来修改check数组 for (i = 0; i < ckdata.loseNum; i++) { check[ckdata.loseFrame[i]] = 0; } if (ckdata.loseNum > 0) //帧丢失 { check[getFrameNum() - 2] = 0; //检查帧需重发 rv = 2; } } break; default: rv = 3; break; } updateRecv_EXIT: return(rv); }
//====================================================================== //函数名称:updateRecv //函数返回:0:数据命令帧发送成功; // 1:解帧操作失败;2:当前更新发生错误,更新操作需重新开始; // 3:检查操作失败;4:其他未知指令 //参数说明:frame:终端返回的帧数据 //功能概要:数据命令帧发送至终端后,终端返回数据至frame。 // 解析frame数据来判断终端操作状态 //====================================================================== public int updateRecv(byte[] frame) { //(1)变量声明 int i; int rv; //返回值 byte order; byte[] data; ushort framenum; ushort curframe; insertData insdata; checkData ckdata; rv = 0; //返回值默认成功,为0 order = 0; data = null; framenum = 0; curframe = 0; insdata = new insertData(); ckdata = new checkData(); //(2)解帧操作 if (!frameDecode(frame, ref data, ref order)) { rv = 1; goto updateRecv_EXIT; //解帧失败 } //(3)命令判断 switch (order) { case 4: //(3.1)终端数据接收成功 //判断返回的帧结构 if (data.Length == Marshal.SizeOf(insdata)) //满足插入帧 { //将byte数据转换为对应的更新帧结构体数据 insdata = (insertData)bytesToStruct(data, typeof(insertData)); framenum = insdata.frameNum; curframe = insdata.curFrame; } //修改发送标识 check[curframe] = 1; //数据发送成功 //若终端接收到开始更新命令,check if (curframe == 0) { for (i = 1; i < check.Length; i++) { check[i] = 0; //check数组初始值为0 } } break; case 5: //(3.2)当前更新发生错误,更新操作得重新开始 for (i = 0; i < check.Length; i++) //check数组重新赋值为0 { check[i] = 0; } rv = 2; break; case 6: //(3.3)检查操作失败 if (data.Length == Marshal.SizeOf(ckdata)) { //将byte数组解析为对应的检查帧结构体数据 ckdata = (checkData)bytesToStruct(data, typeof(checkData)); //根据终端返回的未接收帧号来修改check数组 for (i = 0; i < ckdata.loseNum; i++) { check[ckdata.loseFrame[i]] = 0; } rv = 3; } break; default: //其他未知命令 rv = 4; break; } updateRecv_EXIT: return(rv); }