Laden...

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

Erstellt von BigBearMCS vor 14 Jahren Letzter Beitrag vor 13 Jahren 4.631 Views
BigBearMCS Themenstarter:in
33 Beiträge seit 2007
vor 14 Jahren
Serielle Schnittstelle und FT232RL: bekomme gar nichts brauchbares zurück

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

888 Beiträge seit 2007
vor 14 Jahren
BigBearMCS Themenstarter:in
33 Beiträge seit 2007
vor 14 Jahren

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 😃

479 Beiträge seit 2008
vor 14 Jahren

Hallo,

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

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
BigBearMCS Themenstarter:in
33 Beiträge seit 2007
vor 14 Jahren

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 😉 )

888 Beiträge seit 2007
vor 14 Jahren

Eine falsche UART-Einstellung halte ich wirklich für am wahrscheinlichsten.
Du hast auch keinen HandShake gesetzt, probier mal alle HandShake Varianten durch...

BigBearMCS Themenstarter:in
33 Beiträge seit 2007
vor 14 Jahren

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"?

U
1.688 Beiträge seit 2007
vor 14 Jahren

Mit PuTTY funktioniert alles wunderbar.

Senden/Empfangen/Beides?

Deswegen hab ich mir mal angesehen

Wie?

das ich in etwa sowas zurück bekomme:

Was genau kommt zurück? Und was sollte ankommen?

BigBearMCS Themenstarter:in
33 Beiträge seit 2007
vor 14 Jahren

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

185 Beiträge seit 2005
vor 14 Jahren

Sende doch mal Zeichen für Zeichen mit einer kleinen Pause. Vermutlich ist der Empfänger einfach zu langsam.

U
1.688 Beiträge seit 2007
vor 14 Jahren

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.

BigBearMCS Themenstarter:in
33 Beiträge seit 2007
vor 14 Jahren

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

BigBearMCS Themenstarter:in
33 Beiträge seit 2007
vor 13 Jahren

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