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


von Dom G. (domme2010)


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)


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)


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)


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)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.