www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serielle Schnittstelle zu schnell?


Autor: Chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin Moin
Ich habe folgendes Problem:
Ich nehme sehr schnell sehr viele Messwerte mit einem µC auf (20000 in 
1sec) und speicher diese ab. Danach sollen sie per RS232 and den PC 
übertragen werden. Bei einer Baudrate von 9600 dauert das dann schon mal 
2min. Also habe ich ein wenig rumprobiert und mit dem Hyperterminal bis 
zu 921600 Bauds erreicht!

Jetzt benutzte ich aber ein kleines C-Programm, und nicht das 
Hyperterminal, um die Messwerte entgegenzunehmen. Mit 9600 funktioniert 
das auch super, aber wenn ich zum beispiel auf 57600 oder noch höher 
gehe, stopt die aufzeichnung im C-programm immer nach 85 Zeilen.

Läuft da irgend ein puffer über oder warum passiert das? (ich bin nicht 
so bewand mit der seriellen Schnittstelle)
Der Cpp-Code liegt im Anhang.

Ich bräuchte von euch mal Hinweise oder Tips.

Autor: Termite (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin

Ich vermute mahl, das es an der ausgabe auf den Monitor liegt die 
braucht zu viel zeit.

Leg einfach mal einen grossen puffer an, und schieb die daten nur da 
rein.
Ausgabe dann danach machen.
Auserdem versuch so viel wie möglich an daten von der schnittstelle auf 
einmal einzulesen, nicht jedes byte einzeln.

ggf ein kleines Protokoll drum rum basteln z.B. mit Length info im 
Header.
bzw über flow control nachdenken / ein paktebasiertes protokoll 
überlegen

Sind die HW und Software FIFOS im treiber eingeschalten? ggf hat sind 
die deaktiviert bzw zu klein eingestellt.

Autor: Soe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Vorschlag wäre auch: Bildschirmausgabe erstmal rauskicken und nur 
in die Datei schreiben.
Wenn auch das nicht klappt, erstmal in einen großen Puffer schreiben und 
dann in Datei und auf den Bildschirm.
Schreib doch dann bitte noch mal, wenn es klappt (oder halt auch nicht 
klappt ;-) )

Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sollte nicht darauf vergessen dass bei der Komunikation über RS232 
immer wieder einmal ein Bit "umfällt" und es daduchr zu 
Übertragungsfehlern kommt.

Wenn die Daten binär (0x00 bis 0xFF) übertragen werden, sollte man nicht 
darauf vergessen dass die meißten Terminalprogramme Probleme mit den 
Steuerzeichen haben.
Also entweder vor der Übertragung die Werte in Ascci Zahlen umwandeln 
oder einen Terminal verwenden der die Werte Binär verarbeiten kann.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Man sollte nicht darauf vergessen ...

Was bedeutet dies?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris schrieb:
> Ich nehme sehr schnell sehr viele Messwerte mit einem µC auf (20000 in
> 1sec) und speicher diese ab.


  dcb.fRtsControl = RTS_CONTROL_ENABLE;

Und?
Kümmert sich dein µC auch darum, wenn ihm der PC per CTS signalisiert, 
dass er mal kurz mit dem Senden aufhören soll?

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kommen die Daten in den PC? Bei den Baudraten vermute ich per 
USB-Wandler? Die haben im Bezug auf RS232 so ihre eigenen Macken ....

Wie lang ist das Kabel von uC zum Wandler? Um die 230kBaud habe ich noch 
hinbekommen, drüber wurde es eng. Das lag aber auch am verwendeten uC, 
der dann so langsam schlapp macht.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>  dcb.fRtsControl = RTS_CONTROL_ENABLE;
>>
>>Und?
>>Kümmert sich dein µC auch darum, wenn ihm der PC per CTS signalisiert,
>>dass er mal kurz mit dem Senden aufhören soll?

Aha, nein tut er nicht ^^. Wurde auf DISABLE gesetzt.

Ich habe jetzt noch das "writefile" zeugs rausgenommen und den buffer 
enorm vergrößert.
Jetzt funktionert es erstmal bis 57600 Bauds, dankeschonmal für die 
Hilfe von allen. ich teste nochmal fix weiter.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach auf jeden Fall die Hwardware-Flusskontrolle mit RTS/CTS rein und 
eine Paketbildung mit Checksumme usw ist auch sinnvoll. Ich hab mit 
RTS/CTS und Paketbildung keinerlei Probleme aus dem MSP430 zum PC mit 
921kBaud über den FT232R zu kommunizieren. Da geht nix verloren.

Autor: Termite (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenn das probem eher umgekehrt, das der PC bei kontinuierlichem 
Datenempfang irgend wann mal aussetzt. umgekehrt ist das ja kein 
problem, was stören 10 oder 100 ms pause zwischen 2 bytes? dafür gibts 
ja start und stop bits. und dazwüschen geht ja wohl nicht, da das ja ne 
HW macht.

14Byte Empfangspuffer bei Bautrate n gibt eine gewisse zeit, in der der 
PC was anderes machen darf, bis es zu einem Buffer overrun kommt. Und 
das ein PC mal 7,8 ms was anderes macht als gerade die Anwendung 
auszuführen, die mit der RS232 Arbeitet, das kann durch aus vorkommen.

Wobei es gibt noch ein paar andere Besonderheiten bei der RS232 
Implementierung vom M$
Das warten auf Send buffer empty funktioniert nicht richtig. Meine 
vermutung, es wird der HW sende puffer nicht berücksichtigt. wenn die 
letzten Bytes an den HW puffer übergen wurden wird der Event ausgelöst.

Folge, umschalten der Baudrate nach einem Filewrite und wait for Buffer 
empty führt dazu, das ggf das letzte byte / die letzten byts in der 
neuen bautrate gesendet werden die danach gesetzt wird. ggf wird sogar 
mitten im byte die baudrate umgeschalten. bzw wenn die nachricht kurz 
genug ist die ganze nachricht mit der neuen bautrate gesendet.


Es gibt unterschiede im zeitlichen verhalten bei den OnBoard 
Schnittstellen, je nach dem ob PCI-ISA Bridge oder Legecy anbindung

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.