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()); } }
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()); } } }
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
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
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
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.
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
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
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
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()); } } }
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)
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.