Bei Comport kommt nur erstes Byte an

Blue_Fox

Mitglied
Hi Leute

Ich versuche gerade eine serielle Verbindung mit einem Mirkrocontroller herzustellen. Dies soll ueber USB funktioniern und dazu benutze ich einen FT232.

Ueber Docklight, hab ich schon die "Trockenversuche" gemacht und hier kam alles wunderbar an. Ohne irgendwann einen Aussetzer zu haben.

Jetzt wollte ich mein C# Programm erweitern und anstatt ueber die Serielle Schnittstelle des PC's ueber die USB Schnittstelle auf den uC zugreifen.

Und das funktioniert jetzt nicht******

Kann es sein, dass es hier eine Besonderheit, mit den Vituellen Comports gibt? Dass er z. B. nur immer ein Byte lesen kann?

Hier is mal ein ausschnitt meines codes:

Code:
 // Create and Set the Serialport
            ComPort = new SerialPort();
            ComPort.PortName = Comport;
            ComPort.BaudRate = 4800; //9600
            ComPort.Parity = Parity.None;
            ComPort.DataBits = 8;
            ComPort.StopBits = StopBits.One;

            try
            {
                ComPort.Open();

                ComPort.Write(SendMessage, 0, SendMessage.Length);

                while (proceed)
                {
                    try
                    {
                        Timeout.Start();
                        ComPort.Read(ReceiveMessage, 0, 2);
                        Timeout.Abort();
                        Errorcode = ReceiveMessage[1];
                        proceed = false;
                    }
                    catch
                    {
                        Timeout.Abort();
                        proceed = false;
                        break;
                    }
// ab hier nur weitere Verarbeitung...

ich hoffe ihr koennt mir helfen!!

Mfg

Blue Fox
 

Shakie

Erfahrenes Mitglied
Hallo.

Die Begriffe Docklight und FT232 sagen mir zwar nichts, aber vielleicht kann ich dir trotzdem weiterhelfen.
So wie ich das verstehe verwendest du einen Treiber, der eine virtuelle serielle Schnittstelle im Betriebssystem anmeldet und die Daten aber tatsächlich über USB an einen Mikrocontroller sendet. Stimmt das? Ich habe das mal mit dem Arduino-Board gemacht (vielleicht kennst du das). Das ging problemlos. Es machte im C#-Programm keinen Unterschied, ob die Daten an eine virtuelle oder eine echte serielle Schnittstelle gesendet wurden.

Insofern vermute ich, dass das Problem bei dir woanders liegt. Stimmt eventuell die BaudRate nicht? (Im Code scheinst du ja zwischen zwei Werten zu schwanken :))
Oder sendet der Mikrocontroller die Daten vielleicht gar nicht?
Am C#-Code fällt mir nichts auf. Außer dass du nur eine einzige Read-Anweisung ausführst und die While-Schleife danach beendest. Ist das so gedacht?
 
Zuletzt bearbeitet:

Blue_Fox

Mitglied
Hi Shakie

Der FT232 ist ein Adapterchip, der aus einem USB-Port einen Virtuellen Seriellen Port macht. Also das USB-Signal in Serial uerbersetzt...

und Docklight ist ein sehr nuetliches Programm um ueber eine Serielle Schnittstelle bytes zu senden und zu empfangen.

Arduino ist mir sehr wohl bekannt, hab ich auch daheim ;)

Die 2 Baudraten, hab ich getestet, weil ich zuvor zu viele stoerungen hatte und ich testen wollte, ob evtl. die Baudrate zu hoch war und ich mir selber stoerungen produziert habe.

Die While-Schleife, hab ich nur beendet, um mein programm zu kuerzen, damit er nicht mit den wiederversuchen startet...

Jetzt hab ichs zum laufen gebracht******

Hab aber keine Ahnung, warum dieser Code funktioniert:

Code:
ReceiveMessage[0] = (byte)ComPort.ReadByte();
ReceiveMessage[1] = (byte)ComPort.ReadByte();

anstatt den oben gezeigten mit ComPort.Read(...);

gibt es da einen so grossen unterschied?

mfg

Blue Fox
 

Shakie

Erfahrenes Mitglied
Ich habe eine Vermutung. Kann es sein, dass ReadByte ein Blocking-Call ist, während Read nur bereits empfangene Daten aus dem Buffer holt? Und falls der Buffer gerade leer ist, dann wird nicht auf neue Daten gewartet, sondern einfach null/irgendwas/der letzte Wert(?) zurückgegeben.
Über die BytesToRead-Eigenschaft kannst du herausfinden, wie viele neue Bytes im Eingangsbuffer sind.
Edit: Ein Blick in die MSDN bestätigt die Vermutung. Allerdings steht da auch, dass die ReadByte-Methode eine TimeoutException wirft, wenn keine Daten im Eingangsbuffer stehen. Wurde bei dir eine TimeoutException geworfen?
 
Zuletzt bearbeitet:

Blue_Fox

Mitglied
Hi Shakie

Danke fuer deine Erklaerung!!

Nein ich bekomme keine TimeoutException, hab haber eigentlich auch nicht lange einen leeren buffer...

und ich bin mir nicht sicher, aber ich glaube, im CF funktionieren ueberhaupt keine Timeouts!! Zumindest is das bei TCP und UDP verbindungen so... Deshalb auch mein TIMEOUT-Thread.

Soweit funktionierts jetzt so wie ich es brauche. Die BytesToRead-Funktion is in meinem Fall unnoetig, da ich schon mal weiss, wieviel bytes ich bekommen werde und ich sowieso auf die Antwort warten muss, bevor ich weitermachen kann....

Danke nochmal fuer deine Hilfe!!

MFG

Blue Fox