Probleme mit serieller Kommunikation

Gast #59859
Hallo!

Ich habe ein Problem mit der Kommunikation zwischen Mikrocontroller und
PC. Dazu habe ich die serielle Schnittstelle (wie im Tutorial)
aufgebaut.

Der PC schickt 3 Byte über die serielle Schnittstelle an den uC (4433).
Dieser verarbeitet die Daten und schickt anschließend 2 Byte wieder
zurück. Dies wiederholt sich etwa alle 20ms.

Funktionieren tut das ganze auch soweit ganz gut. Problem ist, dass die
PC Software nach etwa 2 Stunden abstürzt, d.h. sie hängt imho in der
Schleife fest, in der sie auf die Antwort wartet. Ein Fehler in der
Hardware sowie in der uC Software kann ich eigentlich ausschließen.

Also muss wohl der Fehler in der PC Software liegen. Ich weiß, dass es
natürlich etwas off topic is, aber ich hoffe mal, dass hier schonmal
jmd. eine Kommunikation über die serielle Schnittstelle mit C++
realsiert hat. Mein OS ist Win2k und Programmierumgebung das Microsoft
Visual Studio.

Sourcecode ist im Anhang.

So, das wars eigentlich schon. Ich habe das Warten auf die 'Ankunft'
der Zeichen uach schon mit dem WaitCommEvent versucht - da ist er aber
auch nach einiger Zeit hängengeblieben.

Hat jemand eine Idee, was hier nicht funktioniert?!?

Ich bin bereits am überlegen, ob ich nicht auf eine andere Möglichkeit
umsteige mit dem PC zu kommunizieren (z.B. parallele Schnittstelle).
Gibt es hierzu irgendwelche Vorschläge, Links?!?
USB möchte ich nicht verwenden, weil mir das im Moment noch zu
kopmliziert ist und Ende Januar die Kommunkikation funktieren muss ...

Danke für eure Hilfe!!
Grüße
Steffen
Angehängte Dateien:
Gast
Der ganze Code sieht recht merkwürdig aus. Aber da ich nicht genau,
weiss was Du damit später machen willst, ist das erst einmal egal. Die
do-while-Schleife hat natürlich einen großen Nachteil, fällt irgdendwo
ein Byte unter den Tisch ist alles vorbei und der bleibt bei ReadFile
stehen. Ich würde vorher prüfen, ob auch 2 Bytes anstehen und ggf. die
Routine abbrechen.
Gast
Hallo!

Es ist ganz einfach: Ich sende 3 Byte über die serielle Schnittstelle
und warte dann auf 2 Bytes die zurückkommen (müssen).

Vielleicht kann mir hier jemand einen Tipp geben, wie ich das in C++
realisieren kann!?!

Du sagst der Code sieht merkwürdig aus. Hast du evtl ein Beispiel, wie
man das machen sollte oder kannst du etwas genaer sagen, was an dem
Code merkwürdig ist?

Danke!
Steffen
Gast
Fehlerbehandlung gehört in jede serielle Kommunikation, da sie immer
wieder auch tatsächlich vorkommen. Das einfachste Verfahren ist ein
Timeout, d.h. antwortet die Gegenstelle nicht in angemessener Zeit,
wird diese Kommunikation erstmal abgebrochen und noch einige Male neu
gestartet. Passiert wieder nichts, wird das Programm mit Fehlermeldung
beendet. Auf feste Byteanzahl zu warten, ist gefährlich.
Gast
Hi,
wenn ich das richtig sehe, benutzt Du malloc ohne am ende der Funktion
auch ein free zu nutzen.

Bei deinem kurzen Puffer geht doch auch ein lokaler Puffer

char puffer[3]; // oder auch etwas mehr

Das würde Dein Problem mit den 2 Stunden erklären. Dein Speicher ist
voll.

Das Verrückte Pferd hat natürlich recht, Timeout und Fehlerbehandlung
sind nicht zu vernachlässigen.

malloc und free sind auch etwas aus der Mode. In C++ gibt es new und
delete.


Dieter
Gast
Hallo!

Danke für eure Antworten.

Ich hätte das Warten mit der Funktion WaitCommEvent gemacht.
Wie kann diese Wartefunktion abbrechen (für einen TimeOut bzw. eine
Timeout-Zeit einstellen)?

Das Malloc werde ich dann auch abändern ...

Grüße
Steffen
Gast
Hallo Steffen,

" d.h. sie hängt imho in der
                  Schleife fest, in der sie auf die Antwort wartet"

wie sehen denn dann die Statusregisterbits aus?
Höhrt sich für mich wie ein typischer Emfpangsregisterüberlauf an,
kannst Du daß ausschließen?

MfG  Manfred Glahe
Gast
Hallo Manfred,

das Programm ist ja für den PC. Einen Empfangsregisterüberlauf kann ich
in soweit eigentlich ausschließen, als dass erst nachdem 2 Byte
empfangen wurden auch wieder 3 gesendet werden (und damit erst nach dem
empfangen wurde wieder welche ankommen). Das Empfangsregister wird ja
beim auslesen geleert, oder?!

Wie kann man die Statusregisterbis denn auslesen? Über einen Debugger
?!?

Steffen

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.