c# Serielle Schnittstelle Binär-stream processing
Habe ich ein serielles Gerät, dass einen binären output und ich erfassen die Daten mit den folgenden.
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int count = sp.BytesToRead;
byte[] data = new byte[count];
sp.Read(data, 0, data.Length);
file.WriteLine(BitConverter.ToString(data));
}
Daten durch kommt und sieht wie folgt aus...
06-14-F2-A1-64-2D-62-00-1A-31-00-06-14-F3-84-62-59-01-00-1A-31-00-06-14-F3-85-56-52-55-31
1A-31-00-06-14-F4-18-04-2E-62-00-1A-31-00-06-14-F4-E3-27-5B-01-00-1A-31-00-06-14-F4-E4-1C-51-55-31
1A-31-00-06-14-F5-71-4C-59-71-20-1A-31-00-06-14-F5-8E-A5-2E-62-00-1A-31-00-06-14-F5-F4-47-56-55-31-1A-31-00-06-14-F6-10-1A-1A-31-52-24-1A-31-00-06-14-F6-3D-40-19-70-00-1A-31-00-06-14-F6-3E-9C-4C-55-31-1A-33-00-06-14-F6-F6-11-3D-A0-00-17-B0-C8-4E-42-70-AA-00-00-59-51-1E-1A-31-00-06-14-F7-05-4A-2E-62-00-1A-31-00-06-14-F7-83-5C-56-55-31-1A-31-00-06-14-F7-99-04-5A-01-00-1A-31-00-06-14-F7-99-F8-51-55-31-1A-31-00-06-14-F8-7B-EA-2E-62-00-1A-31-00-06-14-F9-00-CE-56-01-00-1A-31-00-06-14-F9-0E-DF-51-55-31-1A-31-00-06-14-F9-F2-8B-2B-62-00-1A-31-00-06-14-FA-15-1F-1D-05-30-1A-31-00-06-14-FA-62-4D-59-01-00-1A-31-00-06-14-FA-63-41-55-55-31-1A-31-00-06-14-FA-6F-6E-1D-67-67-1A-31-00-06-14-FA-EC-50-2E-72-00-1A-31-00-06-14-FB-22-96-38-62-00-1A-31-00-06-14-FB-3B-7A-40-20-43-1A-31-00-06-14-FB-69-2E-2B-62-00-1A-31-00-06-14-FC-62-F1-2D-72-00-1A-31-00-06-14-FC-DF-D1-2E-62-00-1A-31-00-06
Hex ist nicht das Problem hier, wie ich entschlüsseln kann, die aber eine Aussage, die ich Suche, beginnt mit 1A-31 und dann ist eine festgelegte Anzahl von bytes lang. Wie Sie sehen können, den seriellen Datenstrom in diesem Fall beginnt Mitte flow und so ist nicht eine vollständige Erklärung.
Wie kann ich mich für diese Marke, verwerfen Sie den Anfang und dann mit der Verarbeitung beginnen. Bedenken Sie auch, dass dies passieren wird mehrmals als readBuffer an einem gewissen Punkt abschneiden der stream und ich muss Stück es wieder zusammen?
- Ja Sie beantwortet deine Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist fast da. Ihr problem ist, dass die Daten, die Sie streaming kommt in Blöcken, die misalign mit denen Anweisungen beginnen und enden. Ich gehe davon aus, dass die Ende, dass eine Erklärung gefunden wird, ist die 1A-31, identifiziert den Beginn der nächsten Anweisung. Wenn dies nicht wahr, interpretieren diese Antwort entsprechend.
Nun, Sie werden nicht in der Lage, etwas zu tun mit der ersten Stücke von Daten in Ihrem Beispiel, die enthält die Hälfte einer Erklärung. Also, lasst uns beginnen mit der Annahme, dass das erste Stück der Daten, die Sie erhalten in der Tat beginnt mit 1A-31.
Gibt es jetzt zwei Optionen:
StatementReceived
Ereignis und schicken Sie es dort, oder so ähnlich). Wiederholen Sie diese übung, bis das Stück wurde vollständig bearbeitet werden.port_DataReceived
nennen.Wenn die zweite option der Fall war, werden Sie wissen, dass die Daten für die nächsten
port_DataReceived
werden nicht beginnen, mit 1A-31 (da der temporäre Puffer nicht leer ist). Allerdings können Sie Scannen, um das Ende (bis zum nächsten 1A-31), prepend den temporären Puffer (gespeichert in der vorherigenport_DataReceived
nennen), und heben SieStatementReceived
zu löschen und die temporären Puffer.Mit einem ähnlichen Ansatz können Sie sich auch mit Aussagen, bei denen mehr als 2 Datenblöcke gesendet werden; jedes mal, wenn Sie nicht auch eine 1A-31, Anhängen der empfangenen Daten an den temporären Puffer, bis die Anweisung abgeschlossen ist.
Schließlich, wenn die ersten bytes, die Sie Lesen beim Start nicht mit 1A-31, Sie werde nur noch entsorgen diese. Etwas nicht tun können, mit der Hälfte einer Erklärung.