- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 52

Thema: Beispiel Anwendung C# Zugriff auf SerialPort

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    shedepe
    Gast
    Hallo, zum Verständnis allgemein erstmal (sollte auch die erste Anlaufstelle bei anderen Fragen bezüglich C# sein): http://msdn.microsoft.com/de-de/libr...erialport.aspx
    Und nun zu deiner Frage:

    Gesendet wird mit dieser Zeile: Es wird direkt der Inhalt der Textbox über die Serielleschnittstelle gesendet.
    Es gibt auch die Möglichkeit mit "serialPort.Write(buffer[],int Offsize, int count);" Einzelne und mehrere Bytes zu senden, was man häufig bei einem Befehls bzw. Datenprotokoll braucht.
    Code:
                //Hier werden die eingebenen Daten über die serielle Schnittstelle gesendet
                serialPort.WriteLine(tbDataToSend.Text);
    Das Empfangen ist etwas komplizierter:
    Zum einen muss man zuerst das SerialPort.DataRecieved Event abonnieren (Zur Eventbasierten Programmierung empfehle ich diesen Link hier: http://www.mycsharp.de/wbb2/thread.php?threadid=26116)
    Code:
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); //DataRecieved Event abonnieren
    Zum anderen muss man die Daten dann verarbeiten wenn, das Event ausgelöst wird (also Daten angekommen sind)
    Code:
    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) //Methode die Aufgerufen wird, wenn das Event ausgelöst wurde. Die Methode wurde oben festgelegt beim abonnieren
            {
                foreach (var item in serialPort.ReadLine()) //Lese alle verfügbaren Daten. Hier gibt es auch noch andere Auslesemöglichkeiten wie z.B. Read() bzw ReadToEnd()
                {
                    lbRecieved.Invoke(lbRecievedDelegate,new object[]{item});  //Das wird für den Zugriff auf die Gui benötigt. (Thread übergreifende Zugriffe)
                }
            }

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    das schon mal sehr nett

    bin relativer anfänger, habe schon vieles im internet erlesen
    aber dennoch echt schwer für mich

    habe eben 2 USB to RS232 adapter und ein nullmodem kabel bestelle, um damit denn rumzuspielen


    vllt kommen noch fragen auf und ich muss dich leider "nerven"



    VIELEN DANK

  3. #3
    shedepe
    Gast
    Hallo, ich hab grad noch entdeckt dass ich einen kleiner Fehler bei der Verarbeitung der ankommenden Daten gemacht hab. Ich hab das jetzt korrigiert. Im Anhang befindet sich die richtige Version.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    hallo...
    hab nun nen problem mitn empfangen
    wird gesagt das es threadübergreifend ist..
    bekanntes problem ich weiß... ich habe mich damit nun über 20std! beschäftigz....es versucht im internet zu erlesen
    ich packs nicht, bin grad am verzeifeln

    ich brauche irgendwie diesen invoke befehl
    du bist grad meine letzte hoffnung

    ich hoffe du hilfst mir und erklärst mir das problem beim empfangen beim serialport...


    hab hier einfach mal mein ganzen code hochgeladen, kannst dir ja mal anschauen

    schon mal vielen vielen dank
    Geändert von bZzR (27.07.2011 um 23:01 Uhr)

  5. #5
    shedepe
    Gast
    Würde es dir was ausmachen den Code als Textdatei anzuhängen? Hab grad leider nichts zum .rar öffenen da.
    Ganz einfach kannst du das Problem mit dem Threadübergreifenden zu Griff aber so lösen: (Ich beziehe mich bei der Namensgebung der Controls bzw. Objekte auf mein Beispielprogramm)
    Code:
    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {     
       //Hier die Daten die du ausgelesen hast in irgendeiner globalen Variable speichern
       lbRecieved.Invoke(new MethodInvoker(MethodeZumDatenInListboxSchreiben));
    }
    void MethodeZumDatenInListboxSchreiben()
    {
    lbRecieved.Items.Add(<Daten aus der globalen Variable>);
    }
    In meinem Programm habe ich das ganze mit einem Delegaten gelöst was den Vorteil hat dass man sich z.B. den Umweg über die globale Variable sparen kann.

    Hier kannst du das auch nochmal nachlesen:
    http://www.mycsharp.de/wbb2/thread.php?threadid=33113

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports; //serielleSchnittstelle
    using System.Collections; //ArrayListe
    using System.Threading; //Delagation invoke (Threadübergreifend)
    using System.Timers; //Timer


    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }


    SerialPort Schnittstelle = new SerialPort("COM1"); //Deklaration


    byte[] daten = new byte [3];








    private void Form1_Load(object sender, EventArgs e)
    {
    }

















    private void buttonConnect_Click(object sender, EventArgs e)
    { //Festlegung Parameter=

    Schnittstelle.BaudRate = 9600;
    Schnittstelle.Parity = Parity.None;
    Schnittstelle.DataBits = 8;
    Schnittstelle.StopBits = StopBits.One;
    Schnittstelle.Handshake = Handshake.None;
    Schnittstelle.ReadTimeout = 500;
    Schnittstelle.WriteTimeout = 500;

    try
    {
    Schnittstelle.Open(); //Serialport öffnen

    if (Schnittstelle.IsOpen)
    {
    buttonConnect.Enabled = false; //Connect_Button blass
    buttonConnect.Text = "Erfolgreich";
    }
    }
    catch
    {
    MessageBox.Show("Keine Verbindung möglich", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }



    Schnittstelle.DataReceived += new SerialDataReceivedEventHandler(Nebenthread); // Abo_Event abonnieren

    }





    void Nebenthread(object sender, SerialDataReceivedEventArgs e) //Diese Methode wird ausgelöst. Wurde vorher abonniert
    {
    //string serialIn = Schnittstelle.ReadLine();

    //listBox1.Invoke(new EventHandler(delegate { listBox1.Items.Add(serialIn); }));



    this.textBox1.Text = Schnittstelle.ReadExisting();

    }



















    private void buttonDisconnect_Click(object sender, EventArgs e)
    {
    Schnittstelle.Close();
    buttonConnect.Enabled = true;
    buttonConnect.Text = "Connect";
    }

    private void buttonSenden_Click(object sender, EventArgs e)
    {
    daten[0] = 1;
    daten[1] = 2;

    if (Schnittstelle.IsOpen)
    {
    Schnittstelle.Write(daten, 0, daten.Length); //Daten senden
    // oder//Schnittstelle.Write(daten, 0, 2);
    }
    }


    private void Form1_FormClosed(object sender, FormClosedEventArgs e) // Anwendungen schließen = Verbindung trennen
    {
    Schnittstelle.Close();
    }

    }
    }

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    hoffe du blickst durch..

    und wenn du mir da jetzt den passenden code schreibst, bin ich dir unendlich danklbar
    versuche das jetzt natürlich noch selber und morgen auch

    aber wäre dir echt dankbar wenn du was schreibst, ist ja ein leichtes für dich

    DANKE


    PS: ich möchte es auch ohne globale variabeln...hab das eben verucht, gefällt mir alles nicht so :/
    Geändert von bZzR (28.07.2011 um 10:37 Uhr)

  8. #8
    shedepe
    Gast
    Dann wirst du wohl nicht darum kommen dir anzuschaun was das mit den Delegaten auf sich hat, da du ja Daten übergeben möchtest.
    Die Variante mit der globalen Variable ist allerdings wesentlich einfacher:
    Code:
    string Daten = "";
    void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    {     
       Daten = serialPort.ReadLine();   
       lbRecieved.Invoke(new MethodInvoker(MethodeZumDatenInListboxSchreiben)); 
    } 
    void MethodeZumDatenInListboxSchreiben() 
    {    
       lbRecieved.Items.Add(Daten); 
    }

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2012
    Beiträge
    8
    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

Ähnliche Themen

  1. SerialPort & Visual Studio 2008
    Von fat tony im Forum Software, Algorithmen und KI
    Antworten: 31
    Letzter Beitrag: 09.01.2012, 14: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, 22:27
  3. Von String to Hex SerialPort
    Von !*sascha*! im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 04.03.2009, 16:52
  4. Einzelne Leitungen des Serialport steuern
    Von wollez im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 18.02.2005, 20:06
  5. Welche Programmiersprache für SerialPort und Multimedia?
    Von tfranz im Forum Software, Algorithmen und KI
    Antworten: 4
    Letzter Beitrag: 31.08.2004, 13:25

Stichworte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad