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

Serielle Schnittstelle und FT232RL: bekomme gar nichts brauchbares zurück
BigBearMCS
myCSharp.de - Member

Avatar #avatar-2301.jpg


Dabei seit:
Beiträge: 33
Herkunft: Klagenfurt, Austria:)

Themenstarter:

Serielle Schnittstelle und FT232RL: bekomme gar nichts brauchbares zurück

beantworten | zitieren | melden

Hallo Leute,

ich hab folgendes Problem.
Ich versuche über eine (virtuelle) serielle Schnittstelle Daten an einen FT232RL zu senden (ein RS232 zu USB Converter).
Mein Source Code sieht so aus:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace COMTest
{
    public partial class Form1 : Form
    {
        SerialPort myPort;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonTest_Click(object sender, EventArgs e)
        {
            if (myPort != null) myPort.Close();
            myPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
            myPort.DataReceived += new SerialDataReceivedEventHandler(myPort_DataReceived);
            myPort.DtrEnable = true;
            myPort.Open();
            myPort.Write("Hallo");
        }

        void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string message = "";
            while (myPort.BytesToRead > 0)
            {
                message += myPort.ReadExisting().Trim();
            }
            MessageBox.Show(message);
        }
    }
}

Mein Problem ist nun das ich nicht "Hallo" sondern nur ein "H" zurück bekomme.
Manchmal bekomme ich sogar ein "H é " zurück ... Trotzdem werden 5 bytes erkannt, wenn ich myPort.BytesToRead überprüfe.

Mit PuTTY funktioniert alles wunderbar.

Deswegen hab ich mir mal angesehen welche bytes da zuwegen kommen und hab bemerkt, das ich in etwa sowas zurück bekomme:
"92 0 180 192 0"
Ein paar der Zeichen die ich sende werden also nicht zurück gesendet.
Warum??

Ich hoffe ihr könnt mir helfen!

MFG,
BigBear
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

Ähnliches Problem wie hier:

Serielle Schnittstelle auslesen... Ende erkennen??
private Nachricht | Beiträge des Benutzers
BigBearMCS
myCSharp.de - Member

Avatar #avatar-2301.jpg


Dabei seit:
Beiträge: 33
Herkunft: Klagenfurt, Austria:)

Themenstarter:

beantworten | zitieren | melden

Nicht direkt, ich bekomme garnichts brauchbares zurück.
Meine Theorie wäre ja gewesen:
Ich sende das erste byte, also das "H", danach wird sofort das DataReceived Event ausgelöst, welches verhindert, das ich im sleben thread das nächste byte empfangen kann...
Wenn ich ReceivedBytesThreshold ändere, wird das DataReceived Event teilweise garnicht mehr ausgelöst, wenn doch bekomme ich den gleichen mist zurück.
Dein Programm funzt übrigens auch nicht - hat genau das selbe problem.

Danke für die schnelle Antwort :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BigBearMCS am .
private Nachricht | Beiträge des Benutzers
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 520
Herkunft: Henstedt-Ulzburg

beantworten | zitieren | melden

Hallo,

hört sich an als stimme deine Baudrate nicht. Ich kenne das Problem aus der Microcontroller/AVR Programmierung.

mfg.
markus111
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von markus111 am .
private Nachricht | Beiträge des Benutzers
BigBearMCS
myCSharp.de - Member

Avatar #avatar-2301.jpg


Dabei seit:
Beiträge: 33
Herkunft: Klagenfurt, Austria:)

Themenstarter:

beantworten | zitieren | melden

Das habe ich zuerst auch gedacht, doch die Baudrate stimmt 100% - ig.
Hab auch einiges mit µC's zu tun ;)
Zudem frisst der FT232RL so ziemlich jede Baudrate, da er ja eigentlich über USB läuft.
Habs sogar mit 3M Baud getestet, und hat wunderbar funktioniert :) (abgesehen davon das sich der IC nach ~20 gensendeten Zeichen aufgehängt hat ;) )
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BigBearMCS am .
private Nachricht | Beiträge des Benutzers
Joetempes
myCSharp.de - Member

Avatar #avatar-3309.jpg


Dabei seit:
Beiträge: 914
Herkunft: Germany

beantworten | zitieren | melden

Eine falsche UART-Einstellung halte ich wirklich für am wahrscheinlichsten.
Du hast auch keinen HandShake gesetzt, probier mal alle HandShake Varianten durch...
private Nachricht | Beiträge des Benutzers
BigBearMCS
myCSharp.de - Member

Avatar #avatar-2301.jpg


Dabei seit:
Beiträge: 33
Herkunft: Klagenfurt, Austria:)

Themenstarter:

beantworten | zitieren | melden

XonXoff und RTS werden unterstützt, und funktionieren auch, jedoch nicht in meinem Programm :(
Google hat da auch nichts entsprechendes ausgespuckt - hab nur ich diesen "Fehler"?
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Zitat von BigBearMCS
Mit PuTTY funktioniert alles wunderbar.

Senden/Empfangen/Beides?
Zitat von BigBearMCS
Deswegen hab ich mir mal angesehen

Wie?
Zitat von BigBearMCS
das ich in etwa sowas zurück bekomme:

Was genau kommt zurück? Und was sollte ankommen?
private Nachricht | Beiträge des Benutzers
BigBearMCS
myCSharp.de - Member

Avatar #avatar-2301.jpg


Dabei seit:
Beiträge: 33
Herkunft: Klagenfurt, Austria:)

Themenstarter:

beantworten | zitieren | melden

Ich habe am IC dem ich über eine virtuelle RS232 Schnitstelle Daten sende die TX und RX Leitung verbunden.
Sende ich etwas mit PuTTY oder HyperTerminal bekomme ich ein [korrektes] Echo zurück, bei C# nicht.

Also mein Code:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Threading;

namespace COMTest
{
    public partial class Form1 : Form
    {
        SerialPort myPort;
        string msg = "";
        string msg2 = "";
        byte[] b;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (myPort != null) myPort.Close();
            myPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
            myPort.DtrEnable = true;
            myPort.DataReceived += new SerialDataReceivedEventHandler(myPort_DataReceived);
            myPort.Open();
            myPort.Write("Hallo");
        }

        void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (e.EventType == SerialData.Chars)
            {
                b = new byte[myPort.BytesToRead];
                myPort.Read(b, 0, b.Length);
                foreach (byte x in b)
                {
                    if (x != 0)
                    {
                        msg += (char)x;
                        msg2 += " " + x;
                    }
                }                
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {

            MessageBox.Show(msg + "\n" + msg2); 
            msg = "";
            msg2 = "";
        }
    }
}

Ich sende "Hallo", bekomme jedoch nur "H" (in bytes: 72) oder "H±½" (71 177 189) oder etwas in der Richtung.
Wenn ich die Nullen im Buffer nicht weglasse bekomme ich sowas zurück:
"H ±½ " bzw "71 0 177 189 0"

MFG,
BigBear
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

Sende doch mal Zeichen für Zeichen mit einer kleinen Pause. Vermutlich ist der Empfänger einfach zu langsam.
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Hallo,

benutze doch mal einen Com-Port-Sniffer, um den Datentransfer Deiner Anwendung zu prüfen, bspw. den: http://technet.microsoft.com/de-de/sysinternals/bb896644.aspx

Außerdem wäre es sinnvoll, die Daten als Byte-Array zu schicken und zu empfangen und nicht als (Unicode) String. Ein Byte-Array aus dem String (und umgekehrt) macht die Encoding-Klasse.
private Nachricht | Beiträge des Benutzers
BigBearMCS
myCSharp.de - Member

Avatar #avatar-2301.jpg


Dabei seit:
Beiträge: 33
Herkunft: Klagenfurt, Austria:)

Themenstarter:

beantworten | zitieren | melden

Ich habe wirklich alles schon probiert.
Der Empfänger föhnt auch mit 3MBaud noch schön vor sich hin (hab das mit PuTTY getestet) ...
Glaub nicht das er mit 9600 überfordert ist ;)
Das mit dem Byteweisen senden und empfangen hab ich auch schon probiert - selbes Problem.
Sogar mit einem eigen System.IO.Stream hab ichs versucht, funzt auch nicht.

Werd jetzt mal mit dem COM Sniffer nachsehen was überhaupt über die Schnittstelle läuft :)
Danke für den Link!

MFG,
BigBear
private Nachricht | Beiträge des Benutzers
BigBearMCS
myCSharp.de - Member

Avatar #avatar-2301.jpg


Dabei seit:
Beiträge: 33
Herkunft: Klagenfurt, Austria:)

Themenstarter:

beantworten | zitieren | melden

Hab das Problem jetzt gelöst.
Ist nicht sehr elegant und auch nict sehr Laufzeitfreundlich, aber es funktioniert.
Ich habe einfach einen Thread erstellt der Byte für Byte sendet, und dazwischen immer 3ms wartet.

Das Problem war wahrscheinlich, das der IC gesendet und empfangen hat, und deswegen hat er vermutlich einfach ein paar Bytes verworfen.

MFG,
BigBear
private Nachricht | Beiträge des Benutzers