/// <summary> /// Sollte nur vom Konstruktor aufgerufen werden, versucht übergebenes Objekt in M3S-Datenframe oder Interference zu konvertieren /// </summary> /// <param name="rToStore">m3sDataframe oder Bytestream</param> private void analyseAndStore(object rToStore) { // Differenziere was es ist... logTime = DateTime.Now; dgv = new DataGridView(); if (rToStore.GetType() == typeof(IM3S_Dataframe)) { validFrame = rToStore as IM3S_Dataframe; } else if (rToStore.GetType() == typeof(byte[])) { // Konvertierung war nicht erfolgreich, probiere es in einen Bytestream zu verwandeln byte[] tempStream = rToStore as byte[]; try { int errCode = -555; validFrame = protocol.CreateFrameByBytestream(tempStream, out errCode); if (errCode == 0) // Konvertierung war erfolgreich { isValidFrame = true; interference = null; } else // Konvertierung war nicht erfolgreich { validFrame = null; interference = tempStream; // Ablegen isValidFrame = false; } } catch { // Nothing, war einfach nicht konvertierbar... Muss also Störung sein validFrame = null; interference = tempStream; // Ablegen isValidFrame = false; } } else if (rToStore.GetType() == typeof(byte)) { } else { // War auch kein Bytearray, also Exception TBL.Exceptions.ConversionException ex = new TBL.Exceptions.ConversionException("Das bei der Instanzierung an M3sLogFrame übergebene hat keinen gültigen Typ (erlaubt: m3sDataframe und byte[])"); throw ex; } if (this.isValidFrame) { if (this.validFrame.Protocol == M3SProtocol.Reset) { resetCounter++; } } }
private void recBuffer_ByteReceived(object sender, EventArgs e) { int err; while (recBuffer.DataPtr > protocol.MinimumFrameLength) // während im Buffer entsprechen dda { somethingToSend = false; bool ackResult = false; // immer von vorne her anschaun if (state == DevComSlaveState.NotReady) { for (int i = 0; i < resetFrame.Length && i < recBuffer.DataPtr; i++) { if (recBuffer.ReadByte(i) != resetFrame[i]) // If it doesnt match frame { recBuffer.FreeBytes(0, i); // Remove Bytes incl. faulty byte recBuffer.Flush(); break; } if (i == resetFrame.GetUpperBound(0)) // got here without error => reset gotten { recBuffer.FreeBytes(0, i); recBuffer.Flush(); reset(); } } } else { for (int bufferIdx = protocol.MinimumFrameLength - 1; bufferIdx < recBuffer.DataPtr; bufferIdx++) { byte[] possFrame = recBuffer.readBytes(0, bufferIdx); if (protocol.IsFrame(possFrame)) { // Do something with the frame IM3S_Dataframe frame = protocol.CreateFrameByBytestream(possFrame, out err); if (err != 0) { if (debugmode) { stdOut.Error("Could not convert Bytestream to valid M3S-Dataframe: " + TBLConvert.BytesToHexString(possFrame)); } } else { switch (frame.Protocol) { case M3SProtocol.CommandBroadcast: if (frame.MulticastAddress == 0 || frame.MulticastAddress == mcAddr) { ackResult = processFrame(frame, out err); } break; case M3SProtocol.DataTransfer: if (frame.SlaveAddress == slaveAddr) { ackResult = processFrame(frame, out err); } break; case M3SProtocol.Command: if (frame.SlaveAddress == slaveAddr) { ackResult = processFrame(frame, out err); } break; case M3SProtocol.BroadCast: if (frame.MulticastAddress == 0 || frame.MulticastAddress == mcAddr) { ackResult = processFrame(frame, out err); } break; } if (frame.NeedsAcknowledgement && !ackAlreadySent) { hwInterface.WriteData(protocol.GetAcknowledgeFrame(ackResult, possFrame).GetDataframe()); somethingToSend = true; } } // remove the frame recBuffer.FreeBytes(0, bufferIdx); recBuffer.Flush(); } } } if (!somethingToSend) { // Only for TCP clients try { DevComTcpServer serv = hwInterface as DevComTcpServer; // if castable, its a server serv.RemainListening(); } catch { // do nothing instead } } } }