Gast
#3142694
Hallo, ich möchte die Kommunikation mit einem IC in .NET/C# abbilden. Der generelle Protokoll-Frame selbst ist relativ simpel: Länge, Kommando, kommandospezifische Daten, CRC-Prüfsumme. Die Antwort des ICs verwendet den gleichen Aufbau mit dem Unterschied, das zwischen Kommando-Byte und den Daten ein Statusbyte eingefügt ist, um Fehler zu signalisieren: Länge, Kommando, Status, kommandospezifische Daten, CRC-Prüfsumme. Knackig wird die ganze Sache dadurch, dass die kommandospezifischen Daten unterschiedlich aufgebaut sein können. Das heisst beispielsweise, dass die Daten in Abhängigkeit vom Kommando mal als 8-Bit- und mal als 16-Bit-Werte zu interpretieren sind und ggf. auch Kombinationen daraus auftreten (8/16-Bit in einem Kommando). Die Anzahl der Daten kann auch variieren, das heisst alleine am Kommando-Byte kann man die Länge des gesamten Frames nicht immer eindeutig festmachen. Wie geht man nun am besten vor? Die ersten Versuche habe ich mit simplen Byte-Arrays gemacht, hat auch soweit funktioniert. Jedes Kommando wird in einer Funktion bearbeitet, anhand der übergebenen Parameter wurde die Größe des Byte-Arrays berechnet und dieses danach gefüllt. Einer der Nachteile war, dass man die Größe explizit berechnen muss, bevor man die "eigentliche" Arbeit machen kann. Ich frage mich nun, ob der Ansatz an sich geschickt ist, oder ob sich das beispielsweise mit ArrayList bzw. HashTable besser lösen lässt. Bei beiden kann man einfach Elemente anfügen, die Größe ändert sich entsprechend dynamisch und die Vorberechnung der Größe entfällt. Diese benötige ich zwar für das Längenbyte, aber ich würde eher dazu tendieren, das Kommando an sich zu behandeln, und Längenbyte sowie Checksumme erst am Ende (in einer separaten Funktion) um das eigentliche Kommando zu wrappen, da Längenbyte und Prüfsumme nichts mit dem Kommando zu tun haben. Die HashTable hätte zudem den Vorteil, dass man den jeweiligen Werten auch die entsprechenden Feldnamen des Kommandos bzw. dessen Parametern geben kann, was die Übersicht vereinfacht. Hier muss ich aber prüfen ob die Reihenfolge immer eingehalten wird. Umgekehrt wird es wohl etwas schwieriger aus ArrayList/HashTable wieder ein normales Byte-Array zu machen, welches dem seriellen Port übergeben werden kann. Wie löst man sowas geschickt und flexibel für Erweiterungen? Ralf