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); }
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); }