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);
        }
Esempio n. 2
0
        //======================================================================
        //函数名称: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);
        }
Esempio n. 3
0
        //======================================================================
        //函数名称: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);
        }