Entwickler-Ecke
Off Topic - Wie kann man ein 2Byte Datagramm über RS232 senden
Tomstrom - Sa 20.02.10 11:25
Titel: Wie kann man ein 2Byte Datagramm über RS232 senden
Hallo Leute
Schon wieder ein Anfänger im Netz. Ich möchte ein Telegramm über eine RS232 Verbindung senden.
Das Telegramm hat ein Header von 6Byte und 1-200 Byte Daten.
Ich versuche Schrittweise dieses Vorhaben zu meistern.
Nun zu meiner Frage. Ich habe bereits erfolgreich Daten über eine Serielle Verbindung mit der SerialPort Klasse als String als Text und als Byte übertragung gemacht. Nun habe ich aber im Header ein 2Byte Feld, welches nciht funktionert. VisualStudio sagt immer er könne dieses char, ushort oder uint16 nicht als String unwandeln. Wer hat da einen Lösungsansatz?
Vielen Dank für die Mithilfe ;)
Dies ist der Funktionierende Code ohne eben ein 2Byte. Ich versuchte es mit einen 2ten Array, jedoch die Funktion port.Write unterstützt eben das uint16 nicht. Auch veruchte ichn es schon mit convert.To.uint16().
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| namespace RS232 { class Program { public static void Main(string[] args) { byte[] array = new byte[4]; array[0] = 1; array[1] = 120; array[2] = 3; array[3] = 4; SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); port.Open(); port.Write(array, 0, 4); port.Close(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } } |
Moderiert von
Christian S.: C#-Tags hinzugefügt
jfheins - Sa 20.02.10 13:08
Du möchtest also den ushort in ein byte-Array konvertieren?
Das sollte so funktionieren:
C#-Quelltext
1: 2:
| ushort a = 1000; byte[] bytes = BitConverter.GetBytes(a); |
Oder wenn du das direkt in dein Array kopiert haben möchtest:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| byte[] array = new byte[6]; array[0] = 1; array[1] = 120; array[2] = 3; array[3] = 4; Array.Copy(BitConverter.GetBytes((ushort)10000), 0, array, 4, 2); |
jfheins - Sa 20.02.10 19:16
| Zitat: |
Danke hat funktioniert. Das Problem ist aber bei der Ausgabe über die Serielle Verbindung. Die Ausgabe ab dem 4 Index des Arrays ist nicht 2Byte sondern immer nur 1 Byte.
Dies ist unglücklich, da ich eine bestimmte Reihenfolge einhalten muss. Ich habe eine Lösung gefunden, welche aber nicht ganz supi ist. Hast Du da noch einen Vorschlag? Wenn ich dieses Problemchen gelöst habe, kann ich am Montag den ersten Livetest wagen, meines Telegramm-Simulators
Meine erste Lösung, welche nicht allr Bytes rausgibt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| namespace RS232 { class Program {
public static void Main(string[] args) { byte[] array = new byte[7]; array[0] = 62; array[1] = 00; array[2] = 120; Array.Copy(BitConverter.GetBytes((ushort)350), 0, array, 3, 2); array[4] = 01; array[5] = 05; SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); port.Open(); port.Write(array, 0, 6); port.Close(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); }
} | |
Hast du verstanden, was der Code macht? Durch den BitConverter wird ein Array generiert. Da du das Ergebnis aber nicht direkt in dein array einfügen kannst wird es kopiert. (guck dir bitte mal
http://msdn.microsoft.com/de-de/library/z50k9bft.aspx an)
Konkret werden die beiden Bytes aus denen der ushort besteht an die Stellen array[3] und array[4] kopiert. Danach überschreibst du aber den Index 4 wieder - das kann nicht gut gehen ;)
Ich würde es so machen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| byte[] array = new byte[] {62, 00, 120, 0, 0, 01, 05}; Array.Copy(BitConverter.GetBytes((ushort)350), 0, array, 3, 2);
|
Tomstrom - Sa 20.02.10 19:21
Scheibenhonig, dann ist mal vorerst alles klar. Ich glaube ich werde mich dann nächste Woche mal wieder melden. Vorerst bin ich nur sehr glücklich und geh jetzt einen Schluck trinken. Na dann also Prost und vielen Dank. Gruss aus der Schweiz
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!