Forum: PC-Programmierung C#: Daten lesen von Com1 via SerialPort?


von Franz C. (cori)


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

von Slowflyer (Gast)


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

von Aness (Gast)


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

von hugo (Gast)


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

von Maischti (Gast)


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

von Severino R. (severino)


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.

von Maischti (Gast)


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

von Ralf (Gast)


Lesenswert?

Du könntest abfragen, ob überhaupt was im Buffer angekommen ist, bevor 
du readline ausführst... Weiss jetzt leider grad nicht, welche 
Eigenschaft des ComPort-Objekts das ist, musst du mal gucken...

Ralf

von Severino R. (severino)


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

von markus hammerschmidt (Gast)


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

von Karl H. (kbuchegg)


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)

von fefearnaud (Gast)


Angehängte Dateien:

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

von fefearnaud (Gast)


Lesenswert?

Hat jemand eine Idee wie ich mit C# auf den COM-Port Bitweise 16 bit 
Zeichen auslesen kann und die am Bildschirm anzeige

Vielen Dank schonmal im Voraus!

von bAsti (Gast)


Lesenswert?

Hallo erstmal
ich glaube es gibt eine Funktion in .net die nennt sich 
ConvertTo.Bitarray oder so ähnlich.
Einfach ma unter msdn unter Bitarray suchen .

Beitrag #5147527 wurde von einem Moderator gelöscht.
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.