mikrocontroller.net

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


Autor: Franz Coriand (cori)
Datum:

Bewertung
0 lesenswert
nicht 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());
        }
    }

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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());
        }
  }
}

Autor: Aness (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maischti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maischti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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....

> DANKE!!

Bitte

Autor: markus hammerschmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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());
        }
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: fefearnaud (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: fefearnaud (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: bAsti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 .

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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