- 3D-Druck Einstieg und Tipps         
Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte
Ergebnis 41 bis 50 von 52

Thema: Beispiel Anwendung C# Zugriff auf SerialPort

  1. #41
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2012
    Beiträge
    8
    Anzeige

    Powerstation Test
    Hi, ich bin zur Zeit in meiner Abschlussprojekt Phase. Unser Thema ist "Realisierung einer Geschwindigkeitsmessung und Rundenzeiterfassung mittels Mikrocontroller". Meine Aufgabe besteht darin die Übertragung der Werte an den PC.

    Ich bin jetzt soweit kommen das ich ein AVR C Programm geschrieben habe und eine Benutzeroberfläche mittels C Sharp erstellt habe. Mein Problem liegt darin das ich die Werte die ich übertragen will nicht immer an die Benutzeroberfläche ankommen. Mal klappt es mal klappt es nicht. Im Terminal Programm kommt immer was an also am AVR C Programm liegt es nicht. Als Anhang habe ich mal das Event mit dem Datenempfang hinzugefügt. Wäre nett wenn jemand mir dabei noch Tipps geben könnte, zur Sicherer Datenübertragung.


    Danke im vorauss
    Angehängte Dateien Angehängte Dateien

  2. #42
    shedepe
    Gast
    Meiner ansicht nach gehst du etwas falsch ran an die Sache. Du hofft dass wenn du ReadByte aufrufst das richtige Byte auch da ist. Aber wer sagt dass der Roboter zu dem Zeitpunkt zu dem du ReadByte aufrufst schon das passende Byte gesendet hat (Außerdem müsstest du auch noch einen Fehler aufgrund eines Threadübergreifenden vorgangs bekommen, da du ohne invoke aus einem anderen Thread auf die Gui zu greifs). Da du sowie so schon mit dem DataRecievedEvent arbeitest würde ich vorschlagen du schickst vom Roboter aus erst mal ein bestimmtes Byte als Startbedingung. Wenn das Empfangen wurde schreibst du jedes weitere byte, das danach kommt in eine liste bis deine Endbedingung kommt. In der Liste weist du dann dass z.B. das erste Byte für die Geschwindigkeit und das zweite Byte dann für die Rundenzeit steht.



    Code mäßig könnte das ganze im RecievedEvent so aussehen:
    //Globale Variable
    bool PaketStart = false;


    //Event

    byte temp = 0;
    while(temp != -1)
    {
    temp = (byte)serialPort1.ReadByte();
    if(PaketStart)
    {
    if(temp == Endbedingung)
    {
    //Rufe eine Prozedur auf die die Daten in der Liste verarbeitet

    }
    Liste.Add(temp);
    }
    if(temp == StartBedingung)
    {
    PaketStart = true;
    }


    }

  3. #43
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2012
    Beiträge
    8
    Bin nicht frisch in dem Bereich C Sharp, wolte jetzt noch fragen was das Liste.Add(temp) bedeutet? da er mir die Liste rot unterschstreicht

  4. #44
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2012
    Beiträge
    8
    könntest du biite vielleicht paar Kommentare hinter den Befehlszeilen setzen danke

  5. #45
    shedepe
    Gast
    Mit List.Add(temp) meinte ich das was ich auch vorher im Text beschrieben hab, nämlich dass du dir eine Liste definierst ( List<byte> MeineList = new List<byte>()) und der dann das jeweilige Byte hinzufügst.


    Code:
    //Globale Variable
    bool PaketStart = false;
    List<byte> meineListe = new List<byte>();
    
    //Event
    
    byte temp = 0;
    while(temp != -1)   //So lange die Variable temp ungleich -1 ist, also so lange Daten vorhanden sind mache:
    {
           temp = (byte)serialPort1.ReadByte();   //Lese ein byte
          if(PaketStart)    //Sind wir bereits in einem Datenpaket drin ?
          {
               if(temp == Endbedingung)   //Ist das byte die Endbedingung ?
               {
                      //Rufe eine Prozedur auf die die Daten in der Liste verarbeitet (Nur eine Kopie der Datenübergeben und die ursprüngliche liste leeren), das Datenverarbeiten macht    man aus Timinggründen wohl am besten aus einem anderen Thread
    
               }
         else
         {
                  meineListe.Add(temp);  //Ansonsten füge das byte der Liste hinzu
         }
          }
          if(temp == StartBedingung)  //Wir sind in keinem Datenpaket drin, ist das gerade gelesene Byte die Startbedingung ?
          {
               PaketStart = true;   //Ja also setzten wie die Variable PaketStart auf true so dass wir bei dem nächsten Schleifendurchlauf in if-Bedingung weiter oben springen
          }
       
    
    }

  6. #46
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2012
    Beiträge
    8
    Code:
       
     private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)         //Button zum Empfangen
            {
                try
                {              //Globale Variable
                    bool PaketStart = false;
                    List<byte> meineListe = new List<byte>();
    
                    //Event
    
                    byte temp =0;
                    while (temp != -1)   //So lange die Variable temp ungleich -1 ist, also so lange Daten vorhanden sind mache:
                    {
                        temp = (byte)serialPort1.ReadByte();   //Lese ein byte
                        if (PaketStart)    //Sind wir bereits in einem Datenpaket drin ?
                        {
                            if (temp == 66)   //Ist das byte die Endbedingung ?
                            {
                           
                                    //Geschwindigkeit
                                    richTextBox1.Text =  meineListe[5].ToString() + meineListe[6].ToString() + meineListe[7].ToString() + meineListe[8].ToString() +    meineListe[9].ToString();     // Ausgabe Geschwindigkeit
                                    //Rundenzeit
                                    //richTextBox2.Text = char10.ToString() + char11.ToString() + char12.ToString() + char13.ToString() + char14.ToString();    //Ausgabe Rundenzeit
                                    //Runde
                                    label12.Text = meineListe[3].ToString() + meineListe[4].ToString();
                                //Rufe eine Prozedur auf die die Daten in der Liste verarbeitet (Nur eine Kopie der Datenübergeben und die ursprüngliche liste leeren), das Datenverarbeiten macht    man aus Timinggründen wohl am besten aus einem anderen Thread
                                    meineListe.Clear();
                            }     
    
                            }
                            else
                            {
                                meineListe.Add(temp);  //Ansonsten füge das byte der Liste hinzu
                            }
                        }
                        if (temp == 56)  //Wir sind in keinem Datenpaket drin, ist das gerade gelesene Byte die Startbedingung ?
                        {
                            PaketStart = true;   //Ja also setzten wie die Variable PaketStart auf true so dass wir bei dem nächsten Schleifendurchlauf in if-Bedingung weiter oben springen
                        }
    
                    }
           catch { ;}
    }
    Hab das jetzt so geschrieben und unterstreicht mir while (temp != -1) grün mit der Meldung "Warnung 1 Der Vergleich mit einer ganzzahligen Konstante ist nutzlos. Die Konstante befindet sich außerhalb des Bereichs vom Typ "byte".".


    kann ich dieses Temp auch direkt in Char umwandeln, da ich gerne den If(temp == startbedinung) und If(temp == Endbedinung) mit einem Char vergleich will und direk auf den rich text box als Char ausgeben will. wie sieht das dann aus ?

    mfg

  7. #47
    shedepe
    Gast
    Ohh, ja, klar ein byte geht nur von 0 bis 255. Also deklarier die variable temp statt als byte als int und lass bei serialPort1.ReadByte() den cast nach byte weg. Dann sollte die Warnung nicht mehr da sein.

    Damit das ganze allerdings halbwegs erfolg haben kann, würde ich dich bitten dir echt noch mal paar Grundlagen anzuschauen. Das Datenverarbeiten vom SerialPort (der in C# ehh etwas zickig ist) gehört nicht wirklich zu den Einstiegsprogrammen. Z.B. schau dir an was eine globale Variable ist und wie man einen typ in einen anderen Castet.

    Zum Casten mit der Startbedinung wird dir das hier weiterhelfen:
    Angenommen '#' ist die Startbedingung dann kannst du schreiben:

    if(temp == (byte)'#')

    Das direkte ausgeben auf die richTextBox1 sollte sowie so nicht funktionieren, da du einen Fehler aufgrund eines Threadübergreifendenvorgangs bekommen solltest.

  8. #48
    shedepe
    Gast
    So da viel Fragen kamen die sich eigentlich um die selben Kernfragen kamen wollte ich diese noch mal zusammenfassen und auch an dieser Stelle hier auf das Galileo Openbook für C# verweisen, das vollkommen kostenlos und legal im Web erhältlich ist:
    http://openbook.galileocomputing.de/csharp/

    Nun zu den Hauptfragen:

    Wie konvertiere ich den Typ integer (int) in den Typ byte oder in den Typ char?

    Entweder mit einem direkten Cast (der in diesem Fall aufjedenfall funktioniert)
    oder mit der Klasse Convert
    BeispielCode:
    Code:
    int MeinInteger = 100;
    byte MeinByte;
    char MeinChar;
    
    //Den int in byte konvertieren
    MeinByte = (byte)MeinInteger;
    //oder
    MeinByte = Convert.ToByte(MeinInteger);
    
    //Den int in einen char konvertieren
    MeinChar = (char)MeinInteger;
    //oder
    MeinChar = Convert.ToChar(MeinInteger);
    Wenn man bei einen Integer die Methode .ToString() aufruft bekommt man die Zahl als Zeichenkette zurück
    Bsp:
    int EineZahl = 120;
    string EineZeichenkette = EineZahl.ToString();
    //In eine Zeichenkette stehen nun die drei Ziffern 1,2 und 0 drin (Das selbe wie: "120");


    Was ist eine globale Variable?
    In jeder Klasse haben wir verschiedene Methoden. Z.B. Methoden die aufgerufen werden wenn auf einen Button geklickt wurde.
    Nun kann man in einer Methode Variablen definieren auf die man allerdings nicht aus anderen Methoden zugreifen kann.
    Beispiel:
    Ich habe eine Variable in der Methode die aufgerufen wird wenn auf den Button1 geklickt wird. Aus der Methode die aufgerufen wird wenn eine zweiter Button geklickt wird kann man nicht darauf zugreifen.
    Nun gibt es allerdings den Fall, dass auf Variablen aus jeder Methode einer Klasse zugreifen will (Z.B. um einen Status zu speichern), dazu gibt es globale Variablen:

    Beispiel Code:
    Code:
    //Dieser Code steht innerhalb einer Klasse
    
    //Nun eine Globale Variable
    int MeinGlobalerInt = 10;
    
    public void Methode1()
    {
    //Eine lokale Variable
    int MeinLokalerInt = 0;
    
    //Auf die Globale Variable kann ich auch hier zugreifen
    MeinGlobalerInt = 15;
    
    }
    public void Methode2()
    {
    //Auch hier kann ich auf die Globale Variable zugreifen:
    MeinGlobalerInt = 99;
    
    //Auf die Variable aus Methode1 "MeinLokalerInt" kann ich jedoch nicht zugreifen
    MeinLokalerInt = 10; //Gibt Fehlermeldung
    
    }
    Ich erhalte die Fehlermeldung "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement "..." erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."


    Hierzu möchte ich nur auf den folgenden Link verweisen:
    http://www.mycsharp.de/wbb2/thread.php?threadid=33113
    Geändert von shedepe (27.05.2013 um 11:52 Uhr)

  9. #49
    shedepe
    Gast
    Hallo ich hab die Komponente mal etwas erweitert mit Multithreading und Pipes and Filter Architektur bei der der Bytedatenstrom in Datenpaket Objekte zerlegt wird.
    https://www.roboternetz.de/community...pes-and-Filter

  10. #50
    Ich habe dein Programm mal getestet. Zwischen 2 PC über Nullmodem funktioniert das Prima. Ich habe nun ein Gerät das mit RS232 funktioniert. Wenn ich nun ein Terminalprogramm in XP benutze funktioniert alles Top.
    Man sendet ein Befehl und erhält als beispiel die Seriennummer. Mi ihrem Programm lassen sich zwar Befehle senden aber es erfolgt keine Antwort. Können sie mir da weiter heflen?

Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte

Ähnliche Themen

  1. SerialPort & Visual Studio 2008
    Von fat tony im Forum Software, Algorithmen und KI
    Antworten: 31
    Letzter Beitrag: 09.01.2012, 15:26
  2. Warum bremst SerialPort mein Programm aus?
    Von exaware im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 12
    Letzter Beitrag: 29.01.2010, 23:27
  3. Von String to Hex SerialPort
    Von !*sascha*! im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 04.03.2009, 17:52
  4. Einzelne Leitungen des Serialport steuern
    Von wollez im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 18.02.2005, 21:06
  5. Welche Programmiersprache für SerialPort und Multimedia?
    Von tfranz im Forum Software, Algorithmen und KI
    Antworten: 4
    Letzter Beitrag: 31.08.2004, 14:25

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen