public static int ModBus_Expend(byte[] Buf, int Length, ref MB ModBusMsg) { int i = 0; int DataOffSet = 0; int Cheak; ModBusMsg.ErrorFlag = (byte)ModBus_SizeError; if (ModBusMsg.Start != Buf[i++]) { return(0); } if (ModBusMsg.WorkMode == (byte)MasterSlaveMode.WorkMode_Master)//当协议运行为主机模式 { if (ModBusMsg.MasterAddr != Buf[i++]) { return(0); } if (ModBusMsg.SlaveAddr != Buf[i++]) { ; } } else if (ModBusMsg.WorkMode == (byte)MasterSlaveMode.WorkMode_Slave)//当协议运行在从机模式 { byte TempAddr = Buf[i++]; if ((TempAddr != ModBusMsg.SlaveAddr) & (TempAddr != BroadAddr)) { return(0); } if (Buf[i++] != ModBusMsg.MasterAddr) { return(0); } } ModBusMsg.MsgFlag = Buf[i++]; ModBusMsg.MsgNum = Buf[i++]; ModBusMsg.MsgLength = Buf[i++]; ModBusMsg.MsgLength <<= 8; ModBusMsg.MsgLength |= Buf[i++]; if (ModBusMsg.MsgLength > 0) { ModBusMsg.DataFlag = Buf[i++]; ModBusMsg.DataLength = Buf[i++]; ModBusMsg.DataLength <<= 8; ModBusMsg.DataLength |= Buf[i++]; DataOffSet = i; i += ModBusMsg.DataLength; ModBusMsg.Data = new byte[ModBusMsg.DataLength]; for (int n = 0; n < ModBusMsg.DataLength; n++) { ModBusMsg.Data[n] = Buf[DataOffSet++]; } if (ModBusMsg.MsgLength != (ModBusMsg.DataLength + 3)) { return(0); } } if (ModBusMsg.CheakMode == CheakMode_Xor) { Cheak = Tools.Xor(Buf, i); if (Cheak != Buf[i]) { return(0); } i++;//xor校验一位 if (ModBusMsg.End != Buf[i++]) { return(0); } // if (i != (Length - 2)) ModBusMsg.ErrorFlag = ModBus_SizeError;//有可能尾部还有其他直接忽略 } else if (ModBusMsg.CheakMode == CheakMode_Crc) { Cheak = Tools.GetCrc16(Buf, i); //MessageBox.Show(Cheak.ToString("X")); MessageBox.Show(Tools.ByteToInt16(Buf, i, 0).ToString("X")); if (Cheak != Tools.ByteToInt16(Buf, i, 0)) { return(0); } i += 2;//crc校验2位 if (ModBusMsg.End != Buf[i++]) { return(0); } // if (i != (Length)) return 0;//有可能尾部还有其他直接忽略 } if (ModBusMsg.End != Buf[ModBusMsg.MsgLength + 9]) { return(0); } if (i != (ModBusMsg.MsgLength + 10)) { return(0); } ModBusMsg.ErrorFlag = ModBus_Ok; return(DataOffSet); }