Hallo, Ich versuche grad mit C# über die Serielle Schnittstelle meine Hardware anzusteuern. Über den Hex Befehl 0x81 wird die LED1 über 0x82 LED2 usw. bis 0x8F angesteuert. Also 15LEDs insgesamt. Mit --> serialPort1.Write(new byte[] { 0x81 },0,1); kann ich auch schön die LED1 einschalten. Wie kann ich aber nun den Wert (0-15) in diesen Hex Wert umwandeln um ihn senden zu können? Gruß Martin
:
Verschoben durch User
brauchst du gar nicht. Zähl einfach 128 zu den 0..15 dazu und du hast deinen Wert. Ob Hex oder Dezimal (oder Binär) sind nur verschiedene Schreibweisen für ein und dasselbe: eine Zahl.
Also ich hab das jetzt so gemacht. int relaisNr = Convert.ToInt32(numericUpDown1.Value); if (checkBoxOn.Checked) { string hexString = "8" + relaisNr; int num = Int32.Parse(hexString,System.Globalization.NumberStyles.HexNumber); textBox1.Text = num.ToString(); byte[] byteToSend = new byte[1] { Convert.ToByte(num) }; serialPort1.Write(byteToSend, 0, 1); } Die LEDs 1-9 schalten auch schön ein. Nur von 10-15 geht nix mehr. Das Problem ist ja das byte nur von 0-8 geht. Wie kann ich denn das ganze von 0-15 senden? Mit Convert.ToByte geht das ja nur von 0-8.
Probier mal etwas in der Art: byte[] byteToSend = new byte[1] { Convert.ToByte(128+relaisNr) };
Martin schrieb: > Wie kann ich aber nun den Wert (0-15) in diesen > Hex Wert umwandeln um ihn senden zu können? Wenn Du Windows-Anwender bist und aus irgendwelchen Gründen 0x80 und 0x01 bis 0x0F nicht im Kopf zusammenrechnen kannst: Starte mal den WIN7 Taschenrechner "Calc" und schalte ihn auf "Ansicht - Programmierer". Dann kannst Du mit Hexadezimalzahlen und Dezimalzahlen gleichzeitig rechnen. Beispiel: "Hex" 80 + "Dez" 15 = (Ergebnis angezeigt dezimal 143) nochmal "Hex" drücken (Ergebnis angezeigt hexadezimal 8F) Im übrigen solltest Du Dich als Anfänger dringend mal über "Zahlensysteme" informieren, und zwar konkret über die beim Programmieren neben dem Dezimalsystem anzutreffenden Systeme - Binärsystem - Oktalsystem - Hexadezimalsystem Insbesondere Binärsystem und Hexadezimalsystem werden Dir beim Programmieren immer wieder begegnen.
Helfender schrieb: > byte[] byteToSend = new byte[1] { Convert.ToByte(128+relaisNr) }; Ja dieser Befehlt funktioniert so wirklich. byte[] byteToSend = new byte[1] { Convert.ToByte(128 + relaisNr) }; serialPort1.Write(byteToSend, 0, 1); Wenn ich die empfangenen Daten aber anschaue bekomm ich nur Fragezeichen zurück? private string rxstring; private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { rxstring = serialPort1.ReadExisting(); this.Invoke(new EventHandler(displayText)); } private void displayText(object o, EventArgs e) { richTextBox1.AppendText(rxstring); }
Martin schrieb: > Wenn ich die empfangenen Daten aber anschaue bekomm ich nur Fragezeichen > zurück? Ein String ist nun mal keine Zahl! Du musst anfangen, zwischen den prinzipiellen Datentypen Zahl und String zu unterscheiden. Bei Zahlen gilt: du hast in erster Linie eine Zahl. Diese Zahl kannst du in Dezimal, Hexadezimal, Binär, Oktal oder jedem beliebigen anderen Zahlensystem dir ansehen. Aber es ist und bleibt einfach nur eine Zahl. (und deshalb geht das auch indem du einfach 128 dazuzählst). Aber: Wenn du in erster Linie eine Zahl empfängst, dann kannst du die nicht wie einen String behandeln. Denn, es ist kein String!
Zeichensatz beim SerialPort richtig eingestellt? http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.encoding.aspx ...in der Regel setzt man den auf Encoding.Default oder Encoding.GetEncoding(1252) (http://en.wikipedia.org/wiki/Windows-1252, was bei deutscher Windows-Version meist Encoding.Default entspricht) ...wenn dein Mikrocontroller die Werte nicht als Zeichenkette sendet, solltest du auf DataReceived() besser verzichten und lieber einen Thread und SerialPort.ReadByte() oder SerialPort.Read() benutzen...
Ja ich muss natürlich beim Empfangen auch Zahlen also int erwarten dann gehts. private int receivedData; private string hex; private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { receivedData = serialPort1.ReadByte(); hex = receivedData.ToString("X"); this.Invoke(new EventHandler(displayText)); } private void displayText(object o, EventArgs e) { if (hex.Length < 2) { richTextBox1.AppendText("0" + hex + System.Environment.NewLine); } else { richTextBox1.AppendText(hex + System.Environment.NewLine); } }
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.