- LiFePO4 Speicher Test         
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
    Der Delegate ist quasi ein Zeiger auf eine Methode. Und den kann man halt einer anderen Methode übergeben. Der Invoke Befehle sagt dem GUI Objekt (in dem Fall eine Listbox): He ich will auf dich aus einem anderen Thread zugreifen.
    In meiner Beispielanwendung hab ich den delegaten zuerst deklariert:
    Code:
            delegate void InvokeLB(string Data);
    Und dann ein Objekt davon deklariert
    Code:
            InvokeLB lbRecievedDelegate;
    Und dann in der Methode bCreateSP_Click eine neue Instanz erzeugt:
    Code:
              lbRecievedDelegate = new InvokeLB(InvokeLBRecieved);
    Die auf diese Methode hier verweist
    Code:
            void InvokeLBRecieved(string Data) //Parameter stimmen mit der Deklaration des Delegaten überein
            {
                lbRecieved.Items.Add(Data);
            }
    Und in der Methode die Aufgerufen wird wenn neue Daten am SerialPort verfügbar sind rufe ich dann die Invoke Methode der Listbox lbRecieved auf und übergebe ihr den davor instanzierten Delegaten und die Parameter (in dem Fall die Daten die Empfangen wurden)
    Code:
                   lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    ich danke dir das du mir hilfst... habs grad versucht..

    lbRecieved und RecievedLine ist im aktuellen Kontex nicht vorhanden



    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();
    }

    delegate void InvokeLB(string Data); //Delegaten deklariert
    InvokeLB lbRecievedDelegate; //Objekt deklariert


    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);
    }


    lbRecievedDelegate = new InvokeLB(InvokeLBRecieved); //neue Instanz
    Schnittstelle.DataReceived += new SerialDataReceivedEventHandler(Nebenthread); // Abo_Event abonnieren

    }



    void InvokeLBRecieved(string Data) //Parameter stimmen mit der Deklaration des Delegaten überein
    {
    lbRecieved.Items.Add(Data);

    }




    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); }));



    lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});

    //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();
    }

    }
    }



    ich merke grad wie sehr ich anfänger bin... diese invoke und delegate..methoden..threads... überfordert mich total
    dabei wollte ich heut endlich daten empfangen -.-
    Geändert von bZzR (28.07.2011 um 15:06 Uhr)

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    achso... deine lbrecieved war ja deine listbox.. SRY .. so nun noch RecievedLine zuordnen ..

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    Text = Schnittstelle.ReadLine();
    listBox1.Invoke(lbRecievedDelegate,new object[]{Text});


    hab ich nun so gelöst..wenn ichs programm ausführe
    kam zuerst ein timeout,hab ich denn rausgenommen
    nun hängt sich das programm auf und es kommt folgende meldung:

    Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen



    oh man.. hab nur mit anderen terminal gesendet
    kommt bei mir wieder das:
    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Form1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.



    -.-

  5. #5
    shedepe
    Gast
    Die String Variable RecievedLine deklarierst du in der SerialPortDataRecieved Methode (Bei dir Nebenthread) Die Methode würde dann so aussehen:
    Code:
    void Nebenthread(object sender, SerialDataReceivedEventArgs e)  //Diese Methode wird ausgelöst. Wurde vorher abonniert
            {
    string RecievedLine = serialPort.ReadLine();
                lbRecieved.Invoke(lbRecievedDelegate,new object[]{RecievedLine});
                           
            }
    Bitte verwende auch absofort die Code Tags und achte ein bisschen auf die Formatierung deines Quellcodes

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    aaah danke! es funktioniert !!

    ich habe nur das STRING vergessen


    DANKE

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    hey..

    einfach mal eben kurz eine frage
    was spricht gegen diesen befehel=
    CheckForIllegalCrossThreadCalls = false;

    ?

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    19.07.2011
    Beiträge
    17
    Wenn ich jetzt aber eine zweite Textbox einfüge
    kommen meine gesendeten ASCII Zahlen doppelt an
    also wenn ich 12 sende zeigen beide textboxen 1212 an
    ich will aber 12 13 senden.. und die textboxTemp soll 12 anziegen und textboxLuft soll 13 anzeigen.

    und das andere ist wenn die zahlen in der textbox angezeigt sind und ich wieder zahlen sende sollen auch nur die wieder angezeigt werden, nun werden diese einfach vorne mit rangeschrieben


    }


    void InvokeLBRecieved(string Data) //Parameter stimmen mit der Deklaration des Delegaten überein
    {
    textBoxTemp.AppendText(Data);
    textBoxLuft.AppendText(Data);
    //listBox1.Items.Add(Data);
    }




    void Nebenthread(object sender, SerialDataReceivedEventArgs e) //Diese Methode wird ausgelöst. Wurde vorher abonniert
    {

    string Text = Schnittstelle.ReadExisting();
    textBoxTemp.Invoke(Textfeld, new object[] { Text });
    te

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    13.02.2012
    Beiträge
    8
    Hi@all
    bin am verzweifeln!!

    Hier mein Problem!!


    ich habe mal ne frage wie wandel ich den Dezimal Code in ASCII Zeichen um ??
    ........
    string start //String Variable
    start = serialPort1.ReadByte().ToString() // COM Port aus lesen und Byte zu String wandel
    label1.Text = start; //String Ausgabe(Dezimal) auf Label // Ich will hier ein Zeichen drin stehen haben und kein Dezimalzahl des ASCII's

    .........

Ä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. [ERLEDIGT] 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