Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Serialport: Empfangen wird, was vorher gesendet wurde (Echo)
sumnus
myCSharp.de - Member



Dabei seit:
Beiträge: 40

Themenstarter:

Serialport: Empfangen wird, was vorher gesendet wurde (Echo)

beantworten | zitieren | melden

hallo allerseits.

ich hab folgendes Problem.
Ich arbeite mit einem Arduino. Sende Informationen an und empfange Informationen von ihm. Das Problem liegt darin, dass ich immer nur das empfange, was ich ihm gesedet habe. Ich schicke Daten mittels "write"-Befehl und versuche Daten mittels "read"-Befehl zu bekommen. Ich hab auch schon den "ReadLine"-Befehl versucht aber der hat nicht geklappt.

Das ist der Code:



byte[] b;

        public Form1()
        {
            InitializeComponent();

            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.Open();

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.Close();
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if(serialPort1.IsOpen)
            {
                switch (e.KeyCode)
                {
                    case Keys.Up:
                        serialPort1.Write("1");
                        break;
                    case Keys.Down:
                        serialPort1.Write("3");
                        break;
                    case Keys.Left:
                        serialPort1.Write("4");
                        break;
                    case Keys.Right:
                        serialPort1.Write("2");
                        break;
                }             
            }
        }
        
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {             
            b = new byte[serialPort1.BytesToRead];
            serialPort1.Read(b, 0, b.Length);
        }
}

Vielleicht sieht jemand gleich den Fehler oder weiß was mir fehlt.

Danke schonmal, mfG. Sumnus
private Nachricht | Beiträge des Benutzers
telnet
myCSharp.de - Member



Dabei seit:
Beiträge: 330

beantworten | zitieren | melden

Was machst du denn auf der Arduino-Seite ?
Auf Anhieb würde ich im Code jetzt keinen Fehler sehen. Wenn du Daten senden und empfangen kannst würde ich eher sagen dass aus der anderen Seite was nicht stimmt...
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

Ich sehe sofort einen Fehler, du hast keinen Handshake gesetzt.
Siehe auch: Template SerialPort
private Nachricht | Beiträge des Benutzers
sumnus
myCSharp.de - Member



Dabei seit:
Beiträge: 40

Themenstarter:

beantworten | zitieren | melden

Danke für die Hilfe.

Das Problem konnte ich aber leider noch immer nicht lösen. Der Code im Arduino wartet auf eine Eingabe (also einen Import), fragt diesen ab und wenn es einen "1" ist, dann schickt er mit "9" als Antwort. Wenn es eine "2" ist, dann soll er mir nichts antworten.
Ich bekomm aber egal was ich eingebe, genau das zurück was ich hinausgeschickt habe.

Weiß jemand woran das liegen kann?

mfg. sumnus
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

Hast du das mal mit z.B. Hyperterminal getestet?
Bekommst du da die richtigen Antworten?
Eventuell noch CR und/oder LF senden.
private Nachricht | Beiträge des Benutzers
sumnus
myCSharp.de - Member



Dabei seit:
Beiträge: 40

Themenstarter:

beantworten | zitieren | melden

Ja wenn ich im Hyperterminal etwas eingebe und bekomm ich die passenden Antworten. Muss ich vielleicht einen zweiten Thread erzeugen, der für das Auslesen zuständig ist?

Und weiß jemand wieso ich den ReadLine() Befehl nicht nutzen kann?
Ich schreibe Console.WriteLine(serialPort1.ReadLine()); aber nichts passiert. Erst wenn ich die Form1 schließe, kommt eine Fehlermeldung, dass der Vorgang abgebrochen wurde. Ich hab gelesen, dass das passiert weil ich kein Ende festgelegt haben. Aber wenn ich ein Ende festlegen will indem ich vorher ein serialPort1.ReadTimeOut mit z.B. 1000 ms festlege, dann bekomm ich die Fehlermeldung dass das Timeout abgelaufen ist.

weiß jemand woran das liegen könnte?

Danke mfg. sumnus
private Nachricht | Beiträge des Benutzers
telnet
myCSharp.de - Member



Dabei seit:
Beiträge: 330

beantworten | zitieren | melden

Also was ich dir sicher sagen kann ist, dass ich mit der .NET Serial Port Komponente schon mehrfach schlechte Erfahrungen bei der Kommunikation mit Harware (Laborwaagen, Portmultiplexer etc.) gemacht habe.
Im Hyperterminal und Putty lief alles einwandfrei, mit .NET identische Einstellungen aber keine Chance.
Im Endeffekt verwende ich jetzt Komponenten von Drittherstellern - installiert, keine Probleme. Liegt anscheinend in der Implementierung der SerialPort-Klasse.... ist glaube ich auch in der aktuellen DotNetPro ein Artikel drüber drinnen...
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

@telnet
Das kann ich in keinster Weise bestätigen. Ich habe soviel Zeug (Waagen, Scanner, Bluetooth-Module, Kartenleser, uvm) über die SerialPort-Klasse angesteuert und nie, aber wirklich nie, Probleme gehabt. Meist liegen die Probleme in Schicht 8 oder weil keiner die serielle SS oder das Gerät versteht.

Und in dem Artikel über die serielle SS in der DotNetPro geht es um die Konfiguration der seriellen SS.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Joetempes am .
private Nachricht | Beiträge des Benutzers
trib
myCSharp.de - Member



Dabei seit:
Beiträge: 692

beantworten | zitieren | melden

Hallo zusammen,

ein bisschen kann ich telnet schon beipflichten.
Aktuell habe ich ebenfalls ein Problem mit einer Seriellen Schnittstelle. (Historische Gründe halten mich von einer Abkürzung durch doppel-S ab...^^)

Hyperterminal zeigt brav Werte im Dauerversand an.
Verbinde ich meinen Port mit den identischen Einstellungen, so passiert nix.
Mittlerweile habe ich etliche Einstellungen & Konfigurationen in das Programm eingebaut (Handshake, encoding, RTSenable, Zeilenendzeichen, usw.). Leider ebenfalls ohne Erfolg.

Mit anderen Geräten funktioniert es wunderbar. Ob per Send() oder Polling der Daten.

Gibt es noch irgendein Kennzeichen welches Hyperterminal setzt?

Gruß
TriB
private Nachricht | Beiträge des Benutzers