public byte[] BuildHeader ( Commando_Struct send ) { byte[] Frame = new byte[(byte)Communication_Header_Enum.__CMD_HEADER_ENTRYS__ + send.DataLength]; Frame[(byte)Communication_Header_Enum.CMD_HEADER_LENGHT] = (byte)(Communication_Header_Enum.__CMD_HEADER_ENTRYS__ + send.DataLength); Frame[(byte)Communication_Header_Enum.CMD_HEADER_DATA_TYP] = send.DataType; Frame[(byte)Communication_Header_Enum.CMD_HEADER_ID] = send.MessageID; Frame[(byte)Communication_Header_Enum.CMD_HEADER_EXITCODE] = send.Exitcode; Frame[(byte)Communication_Header_Enum.CMD_HEADER_CRC] = 0; byte FrameMasterCRC = 0; for ( int x = 0; x < (byte)Communication_Header_Enum.__CMD_HEADER_ENTRYS__; x++) { FrameMasterCRC = CmdCrc8CCITTUpdate(FrameMasterCRC, Frame[x]); } if ( send.DataLength > 0 ) { for ( int x = 0; x < send.DataLength; x++ ) { FrameMasterCRC = CmdCrc8CCITTUpdate(FrameMasterCRC, send.Data[x]); Frame[(byte)Communication_Header_Enum.__CMD_HEADER_ENTRYS__ + x] = send.Data[x]; } } Frame[(byte)Communication_Header_Enum.CMD_HEADER_CRC] = FrameMasterCRC; #if DEBUG Debug.WriteLine("Cmd(BuildHeader()): " + BitConverter.ToString(Frame, 0, Frame.Length)); #endif return Frame; }
public void CommandoFrameEventFnc( Commando_Struct Parsed ) { // Prüft ob das Event überhaupt einen Abonnenten hat. CommandoFrameEvent?.Invoke( Parsed ); }
public int Parse(byte[] buffer, ref Commando_Struct Commando) { if (buffer.Length < (byte)Communication_Header_Enum.__CMD_HEADER_ENTRYS__) { return -1; } Commando.Data = new byte[buffer[(byte)Cmd.Communication_Header_Enum.CMD_HEADER_LENGHT]]; try { Commando.DataLength = buffer[(byte)Communication_Header_Enum.CMD_HEADER_LENGHT]; Commando.DataType = buffer[(byte)Communication_Header_Enum.CMD_HEADER_DATA_TYP]; Commando.MessageID = buffer[(byte)Communication_Header_Enum.CMD_HEADER_ID]; Commando.Exitcode = buffer[(byte)Communication_Header_Enum.CMD_HEADER_EXITCODE]; SlaveCRC = buffer[(byte)Communication_Header_Enum.CMD_HEADER_CRC]; } catch { return -1; } /* Temporärer Speicher für die Checksummenbildung */ byte[] Frame_ = new byte[] { Commando.DataLength, Commando.DataType, Commando.MessageID, Commando.Exitcode, 0, // CRC ( Muss für die Bildung "0" sein! ) }; /* Checksumme vom Header bilden */ MasterCRC = 0; for (int x = 0; x < (byte)Cmd.Communication_Header_Enum.__CMD_HEADER_ENTRYS__; x++) { MasterCRC = CmdCrc8CCITTUpdate(MasterCRC, Frame_[x]); } /* Checksumme von Nutzdaten bilden */ int DataLength = (int)Commando.DataLength - (byte)Communication_Header_Enum.__CMD_HEADER_ENTRYS__; if (DataLength > 0) { for (int x = 0; x < DataLength; x++) { try { MasterCRC = CmdCrc8CCITTUpdate(MasterCRC, buffer[(byte)Communication_Header_Enum.__CMD_HEADER_ENTRYS__ + x]); Commando.Data[x] = buffer[(byte)Communication_Header_Enum.__CMD_HEADER_ENTRYS__ + x]; } catch { return -4; } } } Commando.DataLength = (byte)DataLength; if (MasterCRC == SlaveCRC) { #if DEBUG Debug.WriteLine("Cmd(Parse()):" + "MasterCRC -> " + MasterCRC + " | " + "SlaveCRC -> " + SlaveCRC); #endif GoodFrameIncomming++; if ( SyncForm != null && SyncForm.InvokeRequired ) { SyncForm.Invoke(new EventDelegate(this.CommandoFrameEventFnc), CommandoParsed); } } else { BadFrameIncomming++; return -5; } return 0; }