Forum: PC-Programmierung C# Programm hängt bei Serial Port1.ReadTo


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dom G. (domme2010)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen ich habe das Problem, das Mein Programm hängt sobald ich 
meinen Serial Port auslesen will.

Ich möchte Dauerhaft Daten auslesen von einer Com Schnittstelle und ein 
Start Signal für die Anlage Senden.

mein Code den ich dauerhaft einlesen will kommt so an T25.21F90.54E
Temperatur = 25.21  Füllstand = 90.54 das E steht für Ende

anbei der Code..

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

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

            string[] ports = SerialPort.GetPortNames();
            cmb_COM.Items.AddRange(ports);
        }

        private void btn_An_Click(object sender, EventArgs e)
        {
             serialPort1.PortName = cmb_COM.Text;
             serialPort1.Open();
             timer1.Start();

        }

        private void btn_Aus_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            serialPort1.Close();

        }

        private void timer1_Tick(object sender, EventArgs e)
        {


             string werte = serialPort1.ReadTo("E");

             char[] char1 = new char[] { 'T', 'F' };
             string[] strings = werte.Split(char1);

             txt_Temp.Text = strings[1].ToString();
             txt_Fuel.Text = strings[2].ToString();

        }

        private void btn_Start_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            if (serialPort1.IsOpen)
            {
                serialPort1.WriteLine("s");
            }
            else
            {
                MessageBox.Show("Port nicht göffnet");
            }
            timer1.Start();
        }


    }
}


vllt könnt ihr mir ja helfen was ich falsch mache
gruß Dominic

von STK500-Besitzer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guck doch erst mal nach, ob überhaupt irgendwas im Empfnagspuffer steht:
"BytesToRead"

ReadTo ist eine blockierende Funktion, die den Progammablauf anhält, bis 
das gewünschte Zeichen empfangen wurde.

von N. M. (mani)


Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer schrieb:
> Guck doch erst mal nach, ob überhaupt irgendwas im Empfnagspuffer steht:
> "BytesToRead"

Sehe ich auch so. Wahrscheinlich ist die Baudrate, Parity oder 
Datenbreite falsch eingestellt und es liegt garnichts im Eingangspuffer.

von cppbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
geht es denn von Hand?: http://www.der-hammer.info/pages/terminal.html

so lange es im Terminal nicht sauber funktioniert würde ich auch auf 
Verbindungsprobleme tippen

von Domme2010 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Doch das passt alles sobald ich den Port öffne hängt das Formular, das 
heißt ich kann den Port nicht mehr schließen... Die Daten werden 
angezeigt und verändern sich auch wenn sich die Daten an der seriellen 
Schnittstelle Ändern.

Mein Problem liegt also nur darin dass mein Formular sich aufhängt ich 
ich somit die Schnittstelle nicht mehr schließen kann und auch kein 
Startsignal Schicken kann.

von bluppdidupp (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mach deinen SerialPort-Kram ggf. einfach in einem BackgroundWorker und 
update die UI von der DoWork des BackgroundWorkers aus via 
ReportProgress().
Dann friert dir die Oberfläche nicht ein, wenn .ReadTo() auf Daten 
wartet.
Einen BackgroundWorker kann man wie den Timer in der Toolbox finden und 
einfach auf die Form ziehen. Zum BackgroundWorker wird man gut Tutorials 
finden können.

(In Windows.Forms kann man in der Regel UI-Elemente nicht ohne weiteres 
von anderen Threads/BackgroundWorkern aus updaten, daher den Umweg über 
ReportProgress() oder Invokes gehen!)

von Dom G. (domme2010)


Bewertung
0 lesenswert
nicht lesenswert
Danke für Antwort

jedoch hat das ganze nicht so funktioniert wie ich das wollte.

mit dem ReportProgress() kann ich leider nur ein int übergeben und kein 
String und wenn ich das alles nur in den DoWork auslagere dann bekomme 
ich ebenso eine Fehlermeldung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.