Forum: PC-Programmierung C# begrenzt COM-Schnittstelle


von Peter (Gast)


Lesenswert?

Hallo

mein Problem ist das ich wenn ich in C# ein Projekt mit 
COM-Schnittstelle 115200 Baud einstelle nur max alle 15 ms einen neuen 
Wert schicken kann, so das dieser aktuelle ist. Wenn ich schneller vom 
Mikrocontroller sende staut es sich irgendwann trotz Datatreceived event 
obwohl der Comport dir ganze Zeit geöffnet ist. Bei einem Bekannten 
läuft das programm ohne Probleme. Bei mir Zeigt das C#programm maximal 
10 empfangene Daten pro Sekunde, obwohl ich bei Hterm 400 mal die Daten 
gesendet bekomme.

private void COMPORT_DataReceived(object sender, 
SerialDataReceivedEventArgs e)
    {
        try
        {
           Einlesen = COMPORT.ReadLine();
           empfangen++;
        }
        catch
        {
           ;
        }
    }

von Peter II (Gast)


Lesenswert?

teste mal ohne events. Beim einen event solle man so lange lesen bis 
nichts mehr kommt. du liest aber nur eine Zeile. Wenn jetzt merh im 
Puffer ist dann kommt auch kein Event mehr.

von Peter (Gast)


Lesenswert?

Das geht aber bei nem Bekannten haben mal probiert wer am schnellsten 
senden kann. Als meins nicht besonders schnell ging hat er mein Programm 
mal bei sich probiert und hab auch da die 400 Datensätze geschickt und 
angezeigt bekommen

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Das geht aber bei nem Bekannten haben mal probiert wer am schnellsten
> senden kann. Als meins nicht besonders schnell ging hat er mein Programm
> mal bei sich probiert und hab auch da die 400 Datensätze geschickt und
> angezeigt bekommen

Wenn es irgendwo geht und woanders nicht liegt es meist an der 
Fehlerhaften software!

Was ist wenn nach dem Event keine Zeilenende kommt? dann blockiert dein 
Programm. Was ist wenn die Daten zu schnell kommen und 2 Zeilen im 
Puffer sind und nur ein event kommt?

von Peter (Gast)


Lesenswert?

Ich schicke vom Mikrocontroller einen String, an jedem String hänge ich 
ein Endzeichen an, was ich auch bei Hterm als Zeilenumbruch angezeigt 
bekomme und da kommen die 400 Daten auch ohne Probleme an ohne fehler.

von Peter II (Gast)


Lesenswert?

Peter schrieb:
> Ich schicke vom Mikrocontroller einen String, an jedem String hänge ich
> ein Endzeichen an, was ich auch bei Hterm als Zeilenumbruch angezeigt
> bekomme und da kommen die 400 Daten auch ohne Probleme an ohne fehler.

und was ist wenn jemand das Kabel abzieht?

ändere deinen code oder lass es wenn du es besser weist.

von Peter (Gast)


Lesenswert?

Das sollte nicht so gemeint sein das ich das nicht ändern will. Ich will 
nur nachvollziehen und verstehen. Gleiche Software mit gleichem 
Controller läuft ja auf anderer Hardware. Nur bei mir eben nicht. Der 
Nachteil ist doch das der Controller im prog dann immer solange wartet 
bis der PC-Empfangsbereit ist. Dadurch geht mir viel perfomance 
verloren.

von Peter II (Gast)


Lesenswert?

dann ändere doch estmal das was ich geschrieben habem, eventuell hilft 
es ja was und dann wird dir auch klar warum das so ist.

In dem Event muss du alles Lesen was da ist nicht nur eine Zeile.

von bluppdidupp (Gast)


Lesenswert?

Peter schrieb:
> Gleiche Software mit gleichem
> Controller läuft ja auf anderer Hardware. Nur bei mir eben nicht. Der
> Nachteil ist doch das der Controller im prog dann immer solange wartet
> bis der PC-Empfangsbereit ist. Dadurch geht mir viel perfomance
> verloren.

Das kann schon alleine an unterschiedlich großen Puffern (Treiber, 
Hardware, etc.) liegen.
Wie bereits gesagt bei Events auf jedenfall alle vorliegenden Daten 
lesen bevor man den Event-Handler verlässt.
Ich persönlich bevorzuge Thread + SerialPort ohne Events, aber das ist 
Geschmackssache.
Wenn es um hohen Durchsatz geht (oder generell) vielleicht auch mal über 
USB nachdenken...

von Timo (Gast)


Lesenswert?

Hi

Ich bin fertig mit einem Windows 7 Hyperterminal mit Plugin-System. Das 
funktioniert sehr gut. Dabei würde ich in Deinem Fall prüfen, wie gross 
der
1
SerialCommPort1.BytesToRead
 ist. Das Lesen über das DataReceived Event würde ich da aussen vor 
lassen. Ich würde, wenn der BytesToRead Count korrekt ist, über
1
SerialCommPort1.Read(Byte(), Int32, Int32)
 arbeiten.
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx


lg
Timo

von Marcus B. (raketenfred)


Lesenswert?

Peter schrieb:
> schicken kann

Gucke mal ob du die Methode Flush() hast- damit jagst du alles aus dem 
Puffer raus.

Kann sein, dass das dir probleme macht

von Peter (Gast)


Lesenswert?

Hallo

also habe es mal ohne Event Versucht, bzw mit

Einlesen = COMPORT.ReadExisting();

Passt auch soweit aber dann gehen ja auch viele Daten verloren. Will 
eine möglichst hohe Datenrate erreichen. Bin da eigentlich nur durch den 
Mikrocontroller begrenzt.

Thread hab ich schon gehört. Würde aber auch gerne zählen lassen wie oft 
die Daten angekommen sind (und Fehlerhaft ausgelesen wurden).

von Peter II (Gast)


Lesenswert?

Teste erstmal ohne events.

einfach eine entlos schleife machen und daten empfangen

while( true ) {
   string Einlesen = COMPORT.ReadExisting();
   System.Diagnostig.Console.Write( Einlesen );
}

von Peter (Gast)


Lesenswert?

Wie gesagt hab jetzt ohne Events getestet das klappt ohne Probleme. Lese 
jetzt auch den ganzen Buffer aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.