Laden...

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

Erstellt von sumnus vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.240 Views
S
sumnus Themenstarter:in
38 Beiträge seit 2009
vor 13 Jahren
Serialport: Empfangen wird, was vorher gesendet wurde (Echo)

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

T
327 Beiträge seit 2006
vor 13 Jahren

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...

888 Beiträge seit 2007
vor 13 Jahren

Ich sehe sofort einen Fehler, du hast keinen Handshake gesetzt.
Siehe auch: Template SerialPort

S
sumnus Themenstarter:in
38 Beiträge seit 2009
vor 13 Jahren

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

185 Beiträge seit 2005
vor 13 Jahren

Hast du das mal mit z.B. Hyperterminal getestet?
Bekommst du da die richtigen Antworten?
Eventuell noch CR und/oder LF senden.

S
sumnus Themenstarter:in
38 Beiträge seit 2009
vor 13 Jahren

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

T
327 Beiträge seit 2006
vor 13 Jahren

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...

888 Beiträge seit 2007
vor 13 Jahren

@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.

T
708 Beiträge seit 2008
vor 13 Jahren

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