Forum: PC-Programmierung C# Serial Port bytes in variable ?


von jango p. (julian_o)


Lesenswert?

Hallo Leute,

ich bin blutiger Anfänger in Programmieren und habe ein kleines Problem 
bei der Programmierung eines Panda II zur steuerung einer LED über 
Bluetooth.

Ich habe es mittlerweile fertig gebracht ein Programm zu schreiben 
welches die LED ansteuert und ich sie damit einschalten kann.

Ich sende über ein Bluetooth-Terminal meines Handys befehele an einen 
Bluetooth-Slave das an dem Com1 port hängt.
Die LED reagiert jedoch auf jeden Byte das ich schicke!

Ich bekomme es einfach nicht hin die Bytes in einen binären Code zu 
wandeln, das z.B. 1=AN und 0=Aus ist.

Hier mal das Programm:


using System;
using System.IO.Ports;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.FEZ;

namespace BTAPP
{

public class Program
{
static SerialPort serial;
static OutputPort Led = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di21, 
false);

public static void Main()
{
// initialize the serial port for COM1 (using D0 & D1)
serial = new SerialPort("COM1",9600, Parity.None, 8, StopBits.One);
// open the serial-port, so we can send & receive data
serial.Open();
// add an event-handler for handling incoming data
serial.DataReceived += new 
SerialDataReceivedEventHandler(serial_DataReceived);
// wait forever...
Thread.Sleep(Timeout.Infinite);
}

static void serial_DataReceived(object sender, 
SerialDataReceivedEventArgs e)
{
int bytesToRead = serial.BytesToRead;
//start reading the stream
if (bytesToRead > 0)
{
// get the waiting data
byte[] buffer = new byte[bytesToRead];

serial.Read(buffer, 0, buffer.Length);

serial.Write(buffer, 0, buffer.Length);

Led.Write(true);
}
Thread.Sleep(100);
Led.Write(false);
}
}
}


Muss das Projekt nächsten Mittwoch abgeben BIIITTTEE helft mir


Vielen Dank

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

julian o. schrieb:
> Ich bekomme es einfach nicht hin die Bytes in einen binären Code zu
> wandeln, das z.B. 1=AN und 0=Aus ist.

und wo ist der versuch etwas zu wandeln?

Und wozu überhaupt wandeln?

Erkläre das Problem noch mal verständlich.

von Karl H. (kbuchegg)


Lesenswert?

julian o. schrieb:


> Die LED reagiert jedoch auf jeden Byte das ich schicke!

Ich versteh jetzt das Problem nicht.
Natürlich tut sie das. Hier ...

> serial.Write(buffer, 0, buffer.Length);
>
> Led.Write(true);
> }

... ist ja auch keine Abhängigkeit davon, was empfangen wurde. Die LED 
wird immer eingeschaltet, wenn etwas empfangen wird. (Der Handler 
aufgerufen wird)

Wie wärs mit einem if?

von jango p. (julian_o)


Lesenswert?

OK,

also ich habe ein FEZ Panda II Board wofür ich in C# ein Programm 
schreiben soll.

Ziel ist es über ein Bluetooth-Terminal via Handy eine 1=LED An 0=LED 
Aus zu schicken.

Bei dem Panda Board habe ich an den COM1 ein Bluetooth-Slave 
angeschlossen.
An einen Outputpin (Di21), eine LED.


Habe mir jetzt das oben gezeigte Programm zusammengestückelt,

das Problem hierbei ist das egal was ich schicke jedes Byte die LED 
anschaltet.

Habe schon im Internet gesucht wie ich jetzt ein If-statement schreiben 
kann um mit z.B. 1 einzuschalten und 0 auszuschalten.

Nur weiss ich nicht genau wonach ich suchen soll... da jedes Byte 
gelesen wird dachte ich, ich müsse die daten die ankommen irgendwie 
umwandeln?

von Karl H. (kbuchegg)


Lesenswert?

julian o. schrieb:

> das Problem hierbei ist das egal was ich schicke jedes Byte die LED
> anschaltet.

Ja. Logisch. Genau das hast du ja programmiert.

>
> Habe schon im Internet gesucht wie ich jetzt ein If-statement schreiben
> kann um mit z.B. 1 einzuschalten und 0 auszuschalten.

Moment.
Du kannst ein Handy programmieren, du kannst eine Bluetooth Strecke in 
Betrieb nehmen und weißt nicht, wie man ein if schreibt?

Wird Zeit das der Komet kommt.


  if ( buffer[0] == 0 )
    Led.Write( true );
  else
    Led.Write( false );


Oder wenn du nicht Bytes mit dem Wert 0 und 1 schickst, sondern die 
ASCII Zeichen '0' und '1', dann eben

  if ( buffer[0] == Convert.ToByte( '0' ) )
    Led.Write( true );
  else
    Led.Write( false );


Und den Klimbim mit dem nachfolgenden Sleep und zurücksetzen der LED 
wirfst du raus.

Für den Fall, dass bei einem Aufruf des Reveive Handler tatsächlich mal 
mehrere Bytes auf einmal kommen, musst du dir dann eben noch was 
überlegen. Oder weißt du auch nicht wie man eine for-Schleife schreibt?

von jango p. (julian_o)


Angehängte Dateien:

Lesenswert?

Wie gesagt ich bin blutiger Anfänger.....wir haben im Studium gerade 
erst mit Programmieren angefangen....


Wenn ich das einfüge markiert er mir buffer usw. ?

von Karl H. (kbuchegg)


Lesenswert?

julian o. schrieb:
> Wie gesagt ich bin blutiger Anfänger.....wir haben im Studium gerade
> erst mit Programmieren angefangen....

Na ja. Das ist jetzt aber eine matte Entschuldigung.

>
>
> Wenn ich das einfüge markiert er mir buffer usw. ?

UNd wo ist jetzt der ganze Teil mit buffer erzeugen und die Bytes von 
der Schnittstelle holen hingekommen?
Wie willst du denn das was empfangen wurde auswerten, wenn du es dir 
nicht von der Schnittstelle abholst? Oder kannst du einen Brief lesen, 
den du nicht in der Hand hast. Nein! Du wirst ihn dir erst vom 
Postkasten holen müssen und dann kannst du reinschauen was drinnen 
steht.

Ähm. Code einfach wo abmalen bringt dich nicht weiter. Mitdenken musst 
du schon! Der C# Code ist ja sowieso schon in einer Form, dass er 
praktisch schon fast englischen Sätzen entspricht. D.h. der ist im 
Original verstehbar, selbst wenn man noch nie programmiert hat! Man muss 
nur lesen was da gestanden hat, und sich überlegen ob das Sinn macht, 
bzw. was man da gerade gelesen hat.

von jango p. (julian_o)


Lesenswert?

Sry aber ich versteh das ganze noch nicht wirklich.....das mit den 
buffer habe ich jetzt gesehen 8)

aber er makiert mir jetzt den Converter.toByte(0)

mit der Fehlermedlung :

Fehler  1  Die beste Übereinstimmung für die überladene 
System.Convert.ToByte(string)-Methode hat einige ungültige Argumente. 
F:\1 .Studium\Fächer\1 + 2 Sem\2. Sem\Programmieren\Dateien\Panda 
Blink\Panda Blink\Program.cs  39  34  Panda Blink

Fehler  2  1-Argument: Kann nicht von "char" in "string" konvertiert 
werden.  F:\1 .Studium\Fächer\1 + 2 Sem\2. 
Sem\Programmieren\Dateien\Panda Blink\Panda Blink\Program.cs  39  49 
Panda Blink

Das ganze sieht jetzt so aus :


using System;
using System.IO.Ports;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.FEZ;

namespace NetduinoPlusApplication1
{

    public class Program
    {
        static SerialPort serial;
        static OutputPort Led = new 
OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di21, false);

        public static void Main()
        {
            // initialize the serial port for COM1 (using D0 & D1)
            serial = new SerialPort("COM1",9600, Parity.None, 8, 
StopBits.One);
            // open the serial-port, so we can send & receive data
            serial.Open();
            // add an event-handler for handling incoming data
            serial.DataReceived += new 
SerialDataReceivedEventHandler(serial_DataReceived);
            // wait forever...
            Thread.Sleep(Timeout.Infinite);
        }

        static void serial_DataReceived(object sender, 
SerialDataReceivedEventArgs e)
        {
            int bytesToRead = serial.BytesToRead;

        //start reading the stream
            if (bytesToRead > 0)
            {
                // get the waiting data
                byte[] buffer = new byte[bytesToRead];

                if (buffer[0] == Convert.ToByte('1'))
                    Led.Write(true);
                else
                    Led.Write(false);

                Led.Write(true);
            }

        }
    }
}


tut mir leid wenn das vllt die blödesten Fragen sind die ihr gehört hab 
aber ich tu mir da echt schwer was zu verstehen :(

von Karl H. (kbuchegg)


Lesenswert?

Dann eben anders rum

   if( Convert.ToChar( buffer[0] ) == '0' )


Und besorg dir ein C# Buch!
(Oder lern wenigstens online nach Dingen zu googeln. Microsoft hat die 
komplette C# Doku mit allen .Net Klassen und allen Methoden online.
Für Datentyp Konvertierungen ist die System Klasse Convert zuständig. 
Und dazu gibt es reichlich Doku)

Die vorhandenen Datentypen, wie man mit ihnen arbeitet, das sind alles 
Basisdinge jeder Programmiersprache (die Datentypen hat). Ohne dieses 
Wissen geht gar nichts.

von jango p. (julian_o)


Lesenswert?

Ich bekomme es leider immer noch nicht hin .....

sieht jetzt so aus ... aber leider gehen immer noch bei allem was ich 
schicke die LED an.







using System;
using System.IO.Ports;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.FEZ;

namespace NetduinoPlusApplication1
{

    public class Program
    {
        static SerialPort serial;
        static OutputPort Led = new 
OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di21, false);

        public static void Main()
        {
            // initialize the serial port for COM1 (using D0 & D1)
            serial = new SerialPort("COM1",9600, Parity.None, 8, 
StopBits.One);
            // open the serial-port, so we can send & receive data
            serial.Open();
            // add an event-handler for handling incoming data
            serial.DataReceived += new 
SerialDataReceivedEventHandler(serial_DataReceived);
            // wait forever...
            Thread.Sleep(Timeout.Infinite);
        }

        static void serial_DataReceived(object sender,
SerialDataReceivedEventArgs e)
        {
            int bytesToRead = serial.BytesToRead;

            //start reading the stream

            {
                // get the waiting data
                byte[] buffer = new byte[bytesToRead];

                if (Convert.ToChar(buffer[0]) == '1')

                if (Convert.ToChar(buffer[0]) == '0')
                    Led.Write(false);

            }

        }
    }
}

von jango p. (julian_o)


Lesenswert?

Ohh bitte hilf mir doch jmd ..... ich probiere heute schon den ganzen 
tag hin und her aber ich bekomme es einfach nicht hin BIIIITTTEEE

von Michael W. (michael_w71)


Lesenswert?

julian o. schrieb:
> Ohh bitte hilf mir doch jmd ..... ich probiere heute schon den ganzen
> tag hin und her aber ich bekomme es einfach nicht hin BIIIITTTEEE

Ich muss jetzt im voraus sagen: Ich habe mit c# nur sehr kurz 
gearbeitet.
Da fehlt erstmal ein
1
Led.Write(true);
 bei der ersten If-Abfrage im handler.
Zweitens behandelst du nur das erste Byte.

Hast du dir mal die Daten auf den Bildschirm ausgeben lassen? Vllt gibt 
es einen Overhead oder dein Board gibt aus irgendeinem Grund immer die 
gleichen Daten an den Rechner?

Bitte häng den Code nächstes mal als Datei an.

Grüße
Michael

Edit:
da hab ich noch was übersehen:
Du liest ja gar nichts aus! Buffer ist voll mit nullen oder was auch 
immer .NET initialisiert.

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.