Laden...

Problem mit der seriellen schnittstelle

Erstellt von liberado vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.426 Views
L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 17 Jahren
Problem mit der seriellen schnittstelle

Hallo Leute,
ich hab ein Problem mit meinem Code. Immer wenn ich die serielle Schnittstelle mit


private void btnLesen_Click(object sender, EventArgs e)
        {

            serialPort1.Open();
            this.label2.Text = serialPort1.ReadLine();
            serialPort1.Close();
        }

abragen möchten, stürzt mein laufendes Programm ab!
An was könnte das liegen ? Oder sitz ich da grad auf der Leitung 🙂 ?
Gruß Liberado

3.511 Beiträge seit 2005
vor 17 Jahren

In wie fern stürzt das Programm ab? Tritt eine Fehermeldung auf, wenn ja welche?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 17 Jahren

nein es tritt keine auf! es reagiert auf nix mehr! Ich kanns das Programm nur noch über strg+alt+ent abschießen! 🙁
Als ob es in einer endlosschleife wäre! Verstehst ungefähr was ich meine ?Es wirft auch keine exceptions 🙁

185 Beiträge seit 2005
vor 17 Jahren

ich verstehe nicht was du da machen willst. Du öffnest den Port, liest und schließt ihn wieder. D.h. in dem moment wo du liest müssen auch die Daten ankommen.
Das wird wohl so nicht funktionieren. Öffne den Port bei Programmstart und schließe ihn bei Programmende. Auserdem solltest du mit events arbeiten.

F
62 Beiträge seit 2005
vor 17 Jahren
this.label2.Text = serialPort1.ReadLine();

An dieser stelle hängt er ja auch in einer endlosschleife.. er wartet bis daten von der Seriellen-schnittstelle eintrudeln und wen dies nicht passiert dan wartet er halt bis er von dir per strg+alt+ent geschlossen wird.

Am besten machst du das mit dem Event OnDataRecieved, bin mir nicht sicher das es so heist aber sonst über sufu solltest du mehr finden.

3.511 Beiträge seit 2005
vor 17 Jahren

Du könntest vielleicht mal den ReadTimeout auf zwei oder drei Sekunden setzen, und schauen, ob dein Programm nach ablauf des Timeouts reagiert.

Es hört sich für mich danach an, das keine Daten vom Com Port kommen. IMHO blockier ReadLine() die Anwendung und wartet solange, bis Daten auf der Leitung liegen. (Bitte korrigiert mich, wenn ich da falsch liege).

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo liberado,

oder Allgemeiner gesprochen: langandauernde oder gar blockiernde Aktionen sind (im GUI Thread) zu vermeiden oder in einem extra Thread auszulagern. Ihc will ja nichts sagen, aber das steht auch in jedem Buch über Windows.Forms-Programmierung.

herbivore

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 17 Jahren

ok danke, jetzt ist mir einiges klar 🙂
weis jemand zufällig wie das OnDatareceived event heißt ? Also zu OnDataReceived find ich nix! danke
Gruß liberado

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo liberado,

SerialPort.DataReceived-Ereignis

herbivore

3.511 Beiträge seit 2005
vor 17 Jahren

Das Ereigniss heißt nur DataReceived.

Zu finden in der Hilfe beim SerialPort.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 17 Jahren

ok danke vielmals
aber wie les ich jetzt die Daten aus die von der seriellen schnittstelle zurück kommen ?
mein code sieht jetzt folgendermasn aus


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace KTL
{
    public partial class Form1 : Form
    {

              

        public Form1()
        {
            InitializeComponent();
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort1_ErrorReceived);
            //serialPort1.PinChanged += new SerialPinChangedEventHandler(OnSerialPinChanged);

        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                MessageBox.Show("ich bin drin");
                MessageBox.Show(this.serialPort1.ReadExisting());
                MessageBox.Show(this.serialPort1.ReadLine());
            }
            catch (Exception ee)
            {
                MessageBox.Show("Fehler " + ee);
            }
        }
        private void serialPort1_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
        {
            MessageBox.Show(e.ToString());
        }




        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show("Wollen sie wirklich beenden?");
            serialPort1.Close();
        }

        
        private void PortOpen_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            serialPort1.RtsEnable = true;
            if (serialPort1.IsOpen)
                this.lblPortStatus.Text = "Port geöffnet";

        }

        private void sendData_Click(object sender, EventArgs e)
        {
            serialPort1.Encoding = Encoding.ASCII;
            serialPort1.WriteLine(txtDatensenden.Text);
            this.lblPortStatus.Text = "Daten gesendet";
                       

        }


       
    }
}

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo liberado,

aber wie les ich jetzt die Daten aus die von der seriellen schnittstelle zurück kommen ?

naja, eben mit ReadExisting und nicht mit ReadLine.

herbivore

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 17 Jahren

kann irgendwie nicht sein! Mit readexisting gibt er mir immer das aus das ich gesendet hab!

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 17 Jahren

ok du hattest recht 😁
Aber ich muss den Befehlt mindestens 5 mal senden bevor was zurück kommt ?? Wie kann das sein ?

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 17 Jahren

oh mann ich komm einfach nicht weiter!

Muss ich die Daten als String senden oder sie vorher in irgendein anderes Format formatieren ?
im Moment sende ich als string oder ascii! funktioniert aber beides nur manchmal!
Also anch dem 5 oder 6 senden kommt die antwort die normal schon nahc de 1 senden kommen müsste!