Moin, ich habe aus dem Forum: Beitrag "Daten auslesen über serielle Schnittstelle C#" void serialPort1DataReceived(object sender, System.EventArgs e) { byte[] buffer = new byte[this.serialPort1.BytesToRead]; this.serialPort1.Read(buffer, 0, this.serialPort1.BytesToRead); for (int i = 0; i<buffer.Length; i++) { tempstring += (" 0x"+buffer[i].ToString("x2")); // tempstring globale Variable } } Meine Frage bezieht sich auf auf die Zeile: tempstring += (" 0x"+buffer[i].ToString("x2")); Was wird in dieser Zeile gemacht? ich weiss dass x2 für Hexdezimalzahlen steht. Wird der buffer an der stelle i in ein String umgewandelt? VG
:
Verschoben durch Moderator
buffer[i].ToString tut genau was du sagst. Das ("x2") dürfte das Zahlenformat HEX angeben. Die Zeile hängt also alle empfangenen Bytes als HEX in einem String aneinander. Zu ToString findet man bei MSDN viele Infos und Beispiele. tempstring muss vor der Schleife aber auf "" gesetzt werden, sonst steht da immer mehr im String drin, was vielleicht nicht gewünscht wird.
:
Bearbeitet durch User
Es wird ein String ausgegeben, der den Inhalt des Buffers als Hexadezimalwert repräsentiert. Der Parameter "x2", welcher der Methode ToString() übergeben wird, bedeutet, dass eine auf zwei Stellen formatiert wird. Beispiel: byte decByte1 = 5; byte decByte2 = 200; String hexVal1 = "0x" + decByte1.ToString("x2"); //ergibt 0x05 String hexVal2 = "0x" + decByte2.ToString("x2"); //ergibt 0xC8
Weil du sonst nur 05 und C8 bekommen würdest. Strings werden mit einem + aneinander gehängt in C#
:
Bearbeitet durch User
Fantasievolle Klammersertzung übrigens :) da äußere Paar kann weg und stört nur den Lesefluss. Kleiner Tip am Range. Wenn tempString wirklich immmer erweitert werden soll. Ist ein StringBuilder die bessere Wahl, weil der String sonst immer umkopiert werden muss (speicher neu anfordern und kopieren). Das wird ziemlich schnell ziemlich langsam.
nicht"Gast" schrieb: > Fantasievolle Klammersertzung übrigens :) > > da äußere Paar kann weg und stört nur den Lesefluss. > > Kleiner Tip am Range. Wenn tempString wirklich immmer erweitert werden > soll. Ist ein StringBuilder die bessere Wahl, weil der String sonst > immer umkopiert werden muss (speicher neu anfordern und kopieren). Das > wird ziemlich schnell ziemlich langsam. Oh je, miese Rechschreibung und Satzzeichen sind auch falsch. Ich bitte das zu verzeihen und geh mir mal einen Kaffee holen.
Eine Frage hätte ich noch. Wenn ich diesen Satz eintippe dann wird tempstring rot unterstrichen. muss ich diese vorher initialisieren? > > tempstring += (" 0x"+buffer[i].ToString("x2")); >
DingDong schrieb: > Eine Frage hätte ich noch. Wenn ich diesen Satz eintippe dann wird > tempstring rot unterstrichen. muss ich diese vorher initialisieren? Ja natürlich. Der ist sonst null. Also einfach bei der Deklaration ein '= ""' anfügen. string tempstring = "";
Kann ich auch anstatt
> string tempstring = "";
auch
string tempstring;
schreiben?
Nein, dann bleibt tempstring nicht initialisiert und ist null. D.h., dass nur der Name exisiert, aber kein Object dahinter steht. damit kracht es beim ersten '+=' da ja nichts da ist. Wenn du irgend wo eine Zuweisung mit '=' hast, dann geht es. Besser ist es allerdings gleich bei der Deklaration auch eine Initialisierung durchzuführen. Das kann die später mal eine nette Fehlersuche ersparen und ist auch im nachhinein leichter zu lesen.
Ach, ein kleiner Link zum Nachlesen: http://www.c-howto.de/tutorial-variablen-deklaration.html ist zwar für C aber das sollte das Grunprinzip von Deklaration und Initialisierung gut aufzeigen.
nicht"Gast" schrieb: > Ach, ein kleiner Link zum Nachlesen: > > http://www.c-howto.de/tutorial-variablen-deklaration.html > > ist zwar für C aber das sollte das Grunprinzip von Deklaration und > Initialisierung gut aufzeigen. Vorsicht. Ich finde den Link nicht gut (auch wenn ich die Absicht honoriere). In C# ist es essentiell, dass man zwischen Wert-Variablen und Referenz-Variablen unterscheidet. Wie du oben ja erwähnt hast, hat man in C# bei
1 | string tmp; |
nicht automatisch schon ein string Objekt, sondern erst mal nur eine Referenz auf ein mögliches String Objekt. Anders als bei
1 | int a; |
bei dem die Variable 'a' bereits mit Speicher unterfüttert ist, um darin einen int Wert zu speichern. Das alles ist anders als in C, bei dem bei einem
1 | struct string tmp; |
der enstprechende Speicher bereits reserviert wird, um darin ein 'struct string' Objekt zu speichern (was immer das dann auch sein soll). Ich empfehle dem TO sich ein C# Lehrbuch zu besorgen oder zumindest erst mal ein paar Tutorials (das können durchaus auch mehrere sein!) durchzuarbeiten. Es gibt Dinge, die sind nun mal essentiell wichtig, wenn man in die Programmierung einsteigt und ohne die ist eine sinnvolle Programmentwicklung nicht möglich. Code von anderen Stellen zu kopieren ist eine durchaus legitime Methode um an Wissen zu gelangen, funktioniert allerdings erst dann, wenn bereits ein entsprechend belastbarer Grundstock an Wissen da ist. Vorher hat das keinen Sinn.
:
Bearbeitet durch User
Der Link sollte eigentlich nur den Unterschied zwischen Deklaration und Initialisation erläutern. Aber du hast ja Recht. Ich hätte einen raussuchen sollen, der direkt von C# handelt. Meistens wird das jedoch in unterschiedlichen Kapiteln abgehandelt und ist nicht an einer Stelle verfügbar.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.