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
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.
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?
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?
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?
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. ?
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.
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 :(
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.
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); } } } }
Ohh bitte hilf mir doch jmd ..... ich probiere heute schon den ganzen tag hin und her aber ich bekomme es einfach nicht hin BIIIITTTEEE
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.