Forum: PC-Programmierung C# Serial Port


von Martin (Gast)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hast du den Post von Karl Heinz
a) nicht gesehen
oder
b) nicht verstanden?

von Helfender (Gast)


Lesenswert?

Probier mal etwas in der Art:

byte[] byteToSend = new byte[1] { Convert.ToByte(128+relaisNr) };

von Jürgen S. (jurs)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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);
}

von Karl H. (kbuchegg)


Lesenswert?

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!

von Bernd H. (geeky)


Lesenswert?

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...

von Martin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.