C# Serial Port

Gast #2891320
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
Gast #2891380
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.
#2891408
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.
Gast #2891409
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);
}
#2891414
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!
#2891431
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...
Gast #2891444
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);
            }
        }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren