2016-08-01 6 views
0

Ich habe Daten von einem seriellen Gerät streamen. Ich habe dies als Hex-String, wobei die Datenpakete immer mit F4 beginnen.Wie teilt man einen Datenstrom in Pakete auf?

ich bin mit:

while (_serialPort.BytesToRead > 0) 
     { 
      var chunk = new byte[_serialPort.BytesToRead]; 
      _serialPort.Read(chunk, 0, chunk.Length); 

      _text += BitConverter.ToString(chunk); 
     } 

Und wie es BytesToRead ist, das Chunk-Variable ist immer anders. Wie sollte ich die Pakete verteilen, wenn sie eintreffen?

Ich denke:

Wenn Zeichenfolge F4 enthält, schieben Daten in den Puffer starten. Bei nächsten F4, stoppen, bestehenden Puffer verarbeiten und neu beginnen zu füllen.

Ist dies ein praktikabler Ansatz? Was ist der beste Weg, um dies zu erreichen?

+0

Was meinen Sie mit * "hex string" *? Ist das 'F4' ein Byte-Wert von 0xF4 oder zwei ASCII-Zeichen" F4 "oder ??? Wenn der Datenabschnitt der Nachricht auch dieses Startbyte/diese Startsequenz enthalten kann, besteht die Gefahr, dass nur auf diesen einen Test vertrauend, Nachrichtenrahmen falsch identifiziert werden. Zumindest müssen Sie auch die Nachrichtenausrichtung mit einer Art der Nachrichtenintegritätsprüfung verifizieren, beispielsweise einer Prüfsumme (oder besser CRC32) und/oder der Erkennung eines Endbytes/einer Endsequenz. Siehe http://stackoverflow.com/questions/16177947/identification-of-packets-in-a-byte-stream/16180135#16180135 für einige grundlegende Konzepte. – sawdust

Antwort

0

Gängige Praxis ist der Puffer

//you should re-use the buffer 
var chunk = new byte[8]; //this should be the actual packet size sent by the device  

int bytesRead; 
while ((bytesRead = _serialPort.Read(chunk, 0, chunk.Length)) > 0) 
{ 
    _text += BitConverter.ToString(chunk, 0, bytesRead); 
} 

Jetzt zu recyceln, wenn Ihre Pakete mit fester Länge sind, dann sollten Sie gut sein, nachdem Sie Brocken eingestellt [] auf die richtige Größe. Wenn dies nicht der Fall ist, verwenden Sie einen StringBuilder, um ihn als Text zu puffern und dann die üblichen String-Analysetechniken zu verwenden.

+0

Hallo, danke für deine Antwort. Ich denke, dass die Paketgröße 50 ist. Wie kann ich sicherstellen, dass das Paket bei "F4" beginnt? – anti

+0

@anti - Wenn die Pakete bei F4 starten und die Paketgröße garantiert 50 ist, dann könnten sie - wenn Sie Glück haben - bei F4 anfangen, wenn Sie die Chunkgröße auf 50 setzen. Wenn nicht - wenn es tatsächlich ist variable Länge - dann müssen wir etwas Textpufferung durchführen. Lassen Sie mich wissen, wenn Sie diese Antwort wollen, da es ein bisschen mehr Arbeit ist. Vielen Dank! – hoodaticus

+0

Das Gerät streamt bereits, wenn ich es anschließe, so ist der Startpunkt leider völlig willkürlich. Der letzte Biss ist eigentlich eine Prüfsumme, aber ich kann keine Informationen darüber finden, wie man ihn benutzt, um die Paketgröße zu überprüfen! – anti

Verwandte Themen