Wann Datenempfang ueber UART zu ende?

Gast #62121
Hallo,
ich habe folgendes Problem: Ich bin dabei, mit bascom ein Programm zu
schreiben, dass mit einem Handy kommunizieren soll. Das Senden
funktioniert bereits super, es scheitert im Moment nur am Empfangen der
Antworten vom Handy. Da die Antworten eine sehr variable Länge haben,
ist es schwer festzustellen, wann es denn nun "nix mehr zu sagen
hat". Die Kommunikation läuft über 9600 baud und die bytes werden
einfach nacheinander in einen String geschoben. Hat vielleicht jemand
eine Idee, wie das Problem auf einigermassen elegante Art und Weise zu
lösen ist?

mfg martin
Gast
wenn das Handy keine festes Ende-Zeichen (ETX oder 0 oder auch ein
anders) sendet, gibts evtl. noch die Möglichkeit, dass eine
Steuerleitung der Handy-Schnittstelle das Ende anzeigt.
Falls beides nicht zutrifft, bleibt dir eigentlich nur ein timeout.
Daten kommen, xxxms passiert nichts mehr -> Ende des Liedes.
Lass doch mal das bray-Terminal mit an der Tx-Leitung des Handys
mithorchen, zeigt dir jedes Byte an (im Gegensatz zu Hyperterminal, da
verpasst man oft die wichtigen Sachen).
Gast
Ich benutz comporttoolkit, funktioniert auch sehr gut. Bin mir
eigentlich sehr sicher, dass nichts dergleichen gesendet wird. Die
einzige Idee die ich haette, waere, das Ende anhand der blocklength
zubestimmen, wird aber wahrscheinlich unendlich kompliziert....

"Daten kommen, xxxms passiert nichts mehr -> Ende des Liedes."
Das Versuch ich auch schon seit geraumer Zeit, ich glaub allerdings
langsam, dass ich zu däml... bin, komm da einfach mit den Gedanken nich
mehr nach :(. Hast du vielleicht sowas wie n Beispiel, oder zumindest
etwas "flussdiagrammähnliches"?

Thx & mfg, martin
Gast
Es waere noch eine Möglichkeit, den String nach jedem Empfangenen Byte
zu überprüfen (also nachzuprüfen, alle Bytes vor dem letzten geXORed
das letzte Byte (checksumme) ergeben. Das kann durch dummen Zufall aber
leider auch mal schiefgehen, ausserdem waer da noch das Problem, dass
immer 2 frames vom Handy gesendet werden. Zuerst ein ackn, danach dann
die eigentliche Antwort auf die "frage" vom pc.

mfg
Gast
dafür gibts mehrere Wege, hier einer davon:
In einer Timer-ISR (sagen wir mal, der Timer löst jede ms einen Int
aus) startest du einen Softwarezähler, wenn du das 1.Byte empfängst. In
der ISR des Timers prüfst du jedesmal, ob ein bestimmter Zählerwert
erreicht wird, und jedes empfangene Byte der UART setzt diesen Zähler
wieder auf 0.
->200ms kein Empfang -> Zähler erreicht 200 -> timeout-bit wird gesetzt
-> Zähler wird gestoppt.
Gast
Hmm, der 2051, mit dem ich das im Moment noch mach, hat leider nur EINEN
Timer, und der geht schon für den Uart drauf. Und das, was du da
geschrieben hast, ist mir trotz der Tatsache, dass ich bascom schon
seit ca 1 Jahr nutze, echt zu hoch g.

danke & mfg
Gast
Hm, Käse, er hat 2 Timer, hab mich mit den Dingern nur noch nie wirklich
befasst, werds dann mal versuchen. Wenn jemand noch nen emtsprechenden
scr findet, kann er ihn ja posten :).

mfg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.