C#: Daten lesen von Com1 via SerialPort?

#372070
Lesenswert?

Hallo,

ich habe ein Gerät an Com1, welches permantent Daten schickt - kann ich
mit dem HyperTerminal nachsehen!

Nun wollte ich meine kleine C#-Anwendung unter VS C# Express schreiben
zum Auslesen der Daten, was sich aber nun gut zwei Tage hinzieht und
sich zum echten Problem entwickelt ;-)

Ich bekomm aktuell KEINE Daten mit dem unten abgebildeten Code - kann
mit jemanden Helfen bzw. sieht den Fehler?

Danke,
Franz

Hier mal der Code - ich habs angehangen, da es ja nur eine simple
Klasse ist:

class SerialPortProgramm
{
        SerialPort port = new SerialPort("COM1", 9600, Parity.None,
8, StopBits.One);

        public static void Main()
        {
            SerialPortProgramm obj = new SerialPortProgramm();
            obj.startReading();
            obj.doSomething();
            obj.stopReading();
            System.Console.ReadLine();
        }

        private SerialPortProgramm()
        {
            port.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived);
        }

        private void startReading()
        {
            port.RtsEnable = true;
            port.Encoding = Encoding.ASCII;
            port.Open();
            System.Console.WriteLine("startReading");
        }

        private void stopReading()
        {
            port.Close();
            System.Console.WriteLine("stopReading");
        }

        private void doSomething()
        {
//            port.Write("&hFFFF");
            while(true)
            {
//                int size = port.BytesToRead;
//                System.Console.WriteLine("Size: {0}", size);
            }
        }

        private void port_DataReceived(object sender,
SerialDataReceivedEventArgs e)
        {
            Console.WriteLine(port.ReadExisting());
        }
    }
Gast #372071
Lesenswert?

Moin,

ich weiss nicht was du für ein Problem hast, bei mir tut es. Hab de
Code nur mal schnell in ein Projekt in Sharpdevelop eingebaut. Ich häng
mal den code hinten dran, vielleicht hab ich ja was unbewusst geändert.

Gruß, Slowflyer

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Text;

namespace consoletest
{
  class MainClass
  {
    SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8,
StopBits.One);

        public static void Main()
        {
            MainClass obj = new MainClass();
            obj.startReading();
            obj.doSomething();
            obj.stopReading();
            System.Console.ReadLine();
        }

        private MainClass()
        {
            port.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived);
        }

        private void startReading()
        {
            port.RtsEnable = true;
            port.Encoding = Encoding.ASCII;
            port.Open();
            System.Console.WriteLine("startReading");
        }

        private void stopReading()
        {
            port.Close();
            System.Console.WriteLine("stopReading");
        }

        private void doSomething()
        {
//            port.Write("&hFFFF");
            while(true)
            {
//                int size = port.BytesToRead;
//                System.Console.WriteLine("Size: {0}", size);
            }
        }

        private void port_DataReceived(object sender,
SerialDataReceivedEventArgs e)
        {
            Console.WriteLine(port.ReadExisting());
        }
  }
}
Gast #693991
Lesenswert?

Hallo alle zusammen!

Ich möchte auch gern die Daten meines integrierten GPS-Empfängers (PDA 
ASUS A636, mit Betriebssystem Windows Mobile 5) über den COM1-Port 
einlesen. Ich sitze schon seit drei Tagen dran, habe erst mit Java 
versucht, jetzt mit C#. Habe ein paar grundlegende Fragen, die mir 
Google oder Beispielcode von anderen Programmieren bisher nicht 
beantworten konnten.
- Ist es überhaupt möglich, mit C# so nah ans Betriebssystem zu kommen, 
ohne externe dll's o.ä. zu benutzen (Welche Programmiersprache wäre 
evtl. die bessere Alternative)?
- muss ich den seriellen Port in meinem C#-Programm irgendwie 
konfigurieren (Baudrate, RtsEnable, Encoding etc.), um Daten zu 
empfangen?
- muss ich den GPS-Empfänger irgendwie aktivieren/starten oder werden 
ständig von dem Ding Daten empfangen und an den COM-Port gesendet?
- was ist mit EventHandler wie SerialDataReceivedEventHandler()? 
Reagieren die automatisch, sobald Daten empfangen wurden und führen den 
Code der übergebenen Methode aus?
- wie kann am COM1-Port lauschen? Sachen wie EventHandler, 
ReadExisting() oder BytesToRead funktionieren ja sicherlich nur ein 
einziges Mal...

Meine Programm-Logik beschreibe ich mal kurz:
- System.IO.Ports.SerialPort erstellen
- SerialDataReceivedEventHandler hinzufügen
- Thread starten, der zunächst den COM1-Port öffnet, dann in einer 
while-Schleife versucht, Daten des Ports zu lesen

Leider kommen nie Daten in meinem Programm an, auch der implementierte 
EventHandler scheint nicht zu wirken.

Ich hoffe sehr, auf Antworten, vielleicht auch auf eine gute 
Literaturempfehlung.

Bis dahin
eure Aness
Gast #694362
Lesenswert?

ich habe mir deinen code nicht so ganz angesehen.
ich mache es in vc# indem ich einen timer starte, der alle x ms abfragt, 
ob bytes im buffer sind (bytes to read)..wenn welche da sind, einfach 
speichern oder ausgeben - je nachdem was man damit machen will.
bevor der timer startet lasse ich nach verfügbaren ports suchen und 
öffne den port.
lässt sich bei dir der port öffnen? gibt er dir die anzahl der 
verfügbaren bytes?

while(true)
            {
//                int size = port.BytesToRead;
//                System.Console.WriteLine("Size: {0}", size);
            }
soweit ich das verstehe, ließt du immer nur die anzahl der bytes aus. 
wieso machst du das mit einer endlosschleife? oder habe ich was 
übersehen?

mfg
Gast #1203492
Lesenswert?

Hallo,

ich habe ein Problem mit meinem SerialPort.

Und zwar steuere ich über C# ein GSM-Modul an. Wenn ich im Hyperterminal 
den Befehl "at+cmgr=1" sende dann löscht das Modul die SMS an 
Speicherstelle 1 und meldet sich auch gleich zurück.
So weit so gut. Wenn ich aber das selbe im C# mache (mit 
Serialport.readline) dann dauert das ca 20 Sekunden bis eine Meldung 
zurückkommt.

Was kann denn da sein?

Danke!

Mfg
#1203506
Lesenswert?

Maischti wrote:
> Hallo,
>
> ich habe ein Problem mit meinem SerialPort.
>
> Und zwar steuere ich über C# ein GSM-Modul an. Wenn ich im Hyperterminal
> den Befehl "at+cmgr=1" sende dann löscht das Modul die SMS an
> Speicherstelle 1 und meldet sich auch gleich zurück.
> So weit so gut. Wenn ich aber das selbe im C# mache (mit
> Serialport.readline) dann dauert das ca 20 Sekunden bis eine Meldung
> zurückkommt.
>
> Was kann denn da sein?
>
> Danke!
>
> Mfg

Was genau sendet das Modul (inkl. Abschlusszeichen) zurück?
ReadLine liest bis zu einem bestimmten Endzeichen oder bis Timeout.
Wenn nun das Endzeichen nicht empfangen wird, kommt ReadLine erst nach 
dem Timeout zurück.
Gast #1215104
Lesenswert?

Hallo,
danke erstmal für die Antwort!

Ich bin gerade draufgekommen wo der Fehler liegt.
Nach dem Befehl "at+cmgr=1" bekomme ich folgendes zurück:
[]
OK[]
[]

wobei [] für einen Zeilenvorschub steht. Und jetzt das beste, das 
Programm hängt sich nur auf, wenn wie du gesagt hast, kein Text 
vorhanden ist ;-)
Leider ist das trotzdem noch jedes zweite mal...

Ich kann nicht ändern was das GSM schickt.
Kann ich vielleicht das Timeout verringern oder programmieren das nur 
dann ein Readline kommt wenn der Text ungleich [] ist?

DANKE!!
Mfg
#1215334
Lesenswert?

Maischti wrote:
> Hallo,
> danke erstmal für die Antwort!
>
> Ich bin gerade draufgekommen wo der Fehler liegt.
> Nach dem Befehl "at+cmgr=1" bekomme ich folgendes zurück:
> []
> OK[]
> []
>
> wobei [] für einen Zeilenvorschub steht.

Und woher weisst Du das so genau? (siehe auch weiter unten)

> Kann ich vielleicht das Timeout verringern oder programmieren das nur
> dann ein Readline kommt wenn der Text ungleich [] ist?

Das Readline "kommt" ja nicht, Du rufst es auf. Und bevor Du es 
aufgerufen hast, weisst Du ja nicht, was angekommen ist.

Jedenfalls sollte Readline auch dann zurückkehren, wenn nur ein 
Zeilenvorschub kommt.

Jetzt muss man aber genau unterscheiden, was ein Zeilenvorschub ist:
CR, LF, CR/LF?

Welches Zeichen (resp. Zeichenkombination) die Readline beendet, wird 
mit der Eigenschaft NewLine eingestellt:

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.newline.aspx>;

> DANKE!!

Bitte
Gast #1312817
Lesenswert?

hallo leute

bitte erklärt mir den untenstehenden code was wann passiert und warum, 
ich brauche das für eine prüfung in der schule

thx im vorhinein

using System;
using System.Collections.Generic;    // was passiert hier
using System.IO.Ports;
using System.Text;

namespace consoletest    // was passiert hier
{
  class MainClass   // was passiert hier
  {
    SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8,
StopBits.One);

        public static void Main()  // was passiert hier
        {
            MainClass obj = new MainClass();
            obj.startReading();
            obj.doSomething();
            obj.stopReading();
            System.Console.ReadLine();
        }

        private MainClass()  // was passiert hier
        {
            port.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived);
        }

        private void startReading()   // was passiert hier
        {
            port.RtsEnable = true;
            port.Encoding = Encoding.ASCII;
            port.Open();
            System.Console.WriteLine("startReading");
        }

        private void stopReading()   // was passiert hier
        {
            port.Close();
            System.Console.WriteLine("stopReading");
        }

        private void doSomething()   // was passiert hier
        {
//            port.Write("&hFFFF");
            while(true)
            {
//                int size = port.BytesToRead;   // was passiert hier
//                System.Console.WriteLine("Size: {0}", size);
            }
        }

        private void port_DataReceived(object sender,
SerialDataReceivedEventArgs e)   // was passiert hier
        {
            Console.WriteLine(port.ReadExisting());
        }
  }
}
#1313283
Lesenswert?

markus hammerschmidt schrieb:
> hallo leute
>
> bitte erklärt mir den untenstehenden code was wann passiert und warum,
> ich brauche das für eine prüfung in der schule

Was sind deine Antworten auf die Fragen?
Was denkst DU was passiert?

(Der Code ist so einfach und selbsterklärend, dass man ihn eigentlich 
nur laut vorlesen muss um zu verstehen, was da passiert. Ein paar 
grundlegende Kentnisse über C# vorausgesetzt)
Gast #1630194
Lesenswert?

Ich habe da ein Test Gerät von meine neue Arbeitstelle bekommen und soll 
es über Serielle Schnittstelle ansprechen können. Daten sollen an das 
Gerät geschickt werden

wie etwas "(0000000000)" und die Karte antwortet mit seine Adresse 
"(0000000000") (wenn keine Input knopf gedrückt ist), an sonst wenn 
INPUT 1 Knopf gedrückt ist,

soll die adresse "(0001000000)" sein. Dieses Teil ist schon gelöst.



Am Gerät blinken 16 Grüne LEDs Input und 16 Rote LEDs Output, Es sind 
noch 16 INPUT Knopfe.

Jetzt soll es auch Möglich sein dass, wenn der Comport geöffnet ist  und 
auf ein der Knopf Taste am gerät gedrückt wird, daß die Entsprechende 
Output Rotes LED aus geht und eine ereignis auf dem Bilschirm ausgelöst 
wird.

Bitte um Ihre mit hilfe.

Danke im voraus
Angehängte Dateien:
Beitrag #5147527 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren