Example #1
0
        public bool Handler(int readCount, byte[] readBuffer)
        {
            FileTransferProtocol.Copy(readBuffer, 0, frameBuffer, validBytes, readCount);
            validBytes += readCount;
            Debug.WriteLine("最大可能的帧冲区长度:" + validBytes);
            //如果找到的可能的帧尾
            while ((findFrameTailIndex = FindTailIndexEx(frameBuffer, findFrameTailIndex + 1, validBytes)) > -1 && validBytes >= FileTransferProtocol.MinFrameLength)
            {
                //如果足够长(有效数据长度不小于最小帧帧长度 找到的帧尾的下标需要不小于最小帧的帧尾下标)
                if (findFrameTailIndex >= FileTransferProtocol.MinFrameLength - 1 && findFrameTailIndex < validBytes)
                {
                    //帧头下标=帧尾下标 - 偏移
                    int headIndex = findFrameTailIndex - BitConverter.ToUInt16(frameBuffer, findFrameTailIndex - FileTransferProtocol.FromFrametailToOffset);
                    Debug.WriteLine(string.Format("@headIndex={0}", headIndex));
                    //如果对应下标项是帧头
                    if ((headIndex >= 0 && headIndex < findFrameTailIndex && headIndex < validBytes) && frameBuffer[headIndex] == frameHead)//只有headIndex大于等于0且小于findFrameTailIndex才有效
                    {
                        Debug.WriteLine(string.Format("#headIndex={0}", headIndex));
                        if (headIndex != 0)
                        {
                            Debug.WriteLine(string.Format("headIndex={0} frameBuffer=[{1:X2},{2:X2},{3:X2},{4:X2} ] findFrameTailIndex={5}", headIndex, frameBuffer[0], frameBuffer[1], frameBuffer[2], frameBuffer[3], findFrameTailIndex));
                        }
                        //前移帧数据
                        if (headIndex != 0)
                        {
                            FileTransferProtocol.Copy(frameBuffer, headIndex, frameBuffer, 0, validBytes - headIndex);
                            validBytes         = validBytes - headIndex;
                            findFrameTailIndex = findFrameTailIndex - headIndex;
                        }
                        //处理数据
                        byte commandType = frameBuffer[FileTransferProtocol.CommandTypeIndex];
                        int  frameLength = BitConverter.ToUInt16(frameBuffer, findFrameTailIndex - FileTransferProtocol.FromFrametailToOffset) + 1;
                        findFrameTailIndex = -1;
                        //Debug.WriteLine(string.Format("frameLength={0},validBytes={1},findFrameTailIndex={2},headIndex={3},cmdType={4}", frameLength, validBytes, findFrameTailIndex, headIndex, cmdType));

                        byte[] da = null;
                        if (frameLength > FileTransferProtocol.FrameStructLength)
                        {
                            da = new byte[frameLength - FileTransferProtocol.FrameStructLength];
                            FileTransferProtocol.Copy(frameBuffer, FileTransferProtocol.CommandDataIndex, da, 0, da.Length);
                        }

                        if (OnReceiveFrame != null)
                        {
                            //是否继续帧分析处理
                            if (false == OnReceiveFrame((FileTransferProtocol.CommandType)commandType, BitConverter.ToInt32(frameBuffer, FileTransferProtocol.ParameterIndex), da))
                            {
                                return(false);
                            }
                        }
                        //清除已处理的帧
                        Array.Clear(frameBuffer, 0, frameLength);
                        //前移未处理的数据
                        int unhandleLength = validBytes - frameLength;
                        if (unhandleLength > 0)
                        {
                            FileTransferProtocol.Copy(frameBuffer, frameLength, frameBuffer, 0, unhandleLength);
                            validBytes         = unhandleLength;
                            findFrameTailIndex = -1;
                        }
                        else
                        {
                            validBytes         = 0;
                            findFrameTailIndex = -1;
                        }
                    }
                    else//对应下标项不是帧头
                    {
                        //继续查找下一个帧尾
                    }
                }
                else//不足则
                {
                    //继续把当前临时缓冲区readBuffer复制到帧缓冲区frameBuffer之中
                }
            }

            //是否继续帧分析处理
            //在外部调用本函数可根据该返回做退出无限循环操作
            findFrameTailIndex = validBytes - FileTransferProtocol.FrameTail.Length;
            return(true);
        }
Example #2
0
        bool serialPortFrameMgr_OnReceiveFrame(FileTransferProtocol.CommandType frameType, int parameter, byte[] commandData)
        {
            switch (frameType)
            {
            case FileTransferProtocol.CommandType.FileName:
                string fileName = System.Text.Encoding.Default.GetString(commandData);

                if (fileName != null)
                {
                    string CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);
                    string startDir    = CurrentPath + @"update\";
                    if (File.Exists(fileName))
                    {
                        File.Delete(fileName);
                    }
                    fStream = File.Open(fileName, FileMode.CreateNew);

                    //SetText(DateTime.Now.ToString() + " 准备接收文件:" + fileName + " 文件总长度:" + parameter);
                    if (OnFileTransferStateMessage != null)
                    {
                        OnFileTransferStateMessage(DateTime.Now.ToString() + " 准备接收文件:" + fileName + " 文件总长度:" + parameter);
                    }
                }
                break;

            case FileTransferProtocol.CommandType.FileData:
                if (fStream != null && commandData != null && commandData.Length > 0)
                {
                    fStream.Write(commandData, 0, commandData.Length);
                    //SetText("收到文件数据长度" + commandData.Length);
                    if (OnFileTransferStateMessage != null)
                    {
                        OnFileTransferStateMessage("收到文件数据长度" + commandData.Length);
                    }
                }
                break;

            case FileTransferProtocol.CommandType.FileSendFinish:

                if (fStream != null)
                {
                    fStream.Close();
                    fStream = null;
                    if (OnFileTransferStateMessage != null)
                    {
                        OnFileTransferStateMessage(DateTime.Now.ToString() + " 收到文件结束信号");
                    }
                    //SetText(DateTime.Now.ToString() + " 收到文件结束信号");
                }
                break;

            case FileTransferProtocol.CommandType.WhatIsYourMNandVersion:
                byte[] frame = FileTransferProtocol.GetFrameMNVersionLimited(mVersion, mThisDeviceMN, mSerialPort.BaudRate);
                mSerialPort.Write(frame, 0, frame.Length);
                if (OnFileTransferStateMessage != null)
                {
                    OnFileTransferStateMessage(string.Format("服务端索要MN及版本,本机以应答:MN={0} 版本:{1}", "123", 1));
                }
                break;

            case FileTransferProtocol.CommandType.Message:
                string message = System.Text.Encoding.Default.GetString(commandData);
                if (OnFileTransferStateMessage != null)
                {
                    OnFileTransferStateMessage(message);
                }
                //this.Invoke(new EventHandler(delegate(object s, EventArgs ar)
                //{
                //    this.txtData.Text += message + "\r\n";
                //}));
                break;

            default:
                if (OnFileTransferStateMessage != null)
                {
                    OnReceiveFrame(frameType, parameter, commandData);
                }
                break;
            }

            return(true);
        }