Hallo Leute,
Bin gerad dabei eine RS232 Kommunikation auf einem ATmega128 in GCC zu
schreiben.
Klappt auch alles wunderbar. Wenn ein Zeichen ankommt, springt er in die
ISR, schreibt UDR weg in eine Variable, die ich dann weiterverarbeite.
Alles bestens. Jetzt zu dem Problem:
Die Daten die empfangen werden sollen, liegen in einer Datei auf dem PC
vor (.txt). Da der uC die Daten schon wärend des Empfangs verarbeiten
soll, suche ich nach einer Lösung die das Senden des PC´s anhalten kann.
Die Lösung, dachte ich, ist in einer Hardware Flußkontrolle zu finden.
Also die RTS Leitung des SUB-D Steckers auf T2out des Max232 und einen
freien Portpin des Processors auf T2in. Das Terminal Programm (HTerm)
visualisiert mir auch das gesetzt sein, oder nicht, richtig.
Jetzt aber zu dem erstaunlichem:
Ich will beispielsweise drei Byte empfangen...
Sende ich sie einzeln, geht die CTS Anzeige im Terminalprogramm nach dem
dritten Byte (zeichen) aus, und es werden keine weiteren zeichen
gesendet. Wunderbar, genauso wie ich es haben wollte.
Jetzt nehme ich eine Datei (.txt) mit 10Byte, und, er sendet und
empfängt diese 10Byte!! und erst danach geht die CTS Anzeige im
Terminalprogramm aus und es kann nichts mehr gesendet werden. Es kann
natürlich sein, bzw. ist so, das die CTS Anzeige halt auch schon nach
3Byte aus geht, nichts desto trotz sendet der PC fröhlich weiter als
wäre nichts!
Wenn ich dann nachdem ich die drei Byte verarbeitet habe, wieder zurück
springe, CTS wieder auf 1 schreibe und die restlichen 7Byte erwarte,
passiert natürlich nichts mehr...
Jemand irgendeine Idee??
Gruß Ralf
ich nochmal, vielleicht ist ja die Lösung das ich statt RTS/CTS einfach
die Pins DTR/DSR nehmen muß? Der Unterschied zwischen diesen beiden
würde mich auch intressieren...
Hallo,
das liegt daran, das der Sender noch seinen Buffer rausschickt, nachdem
das "Stop" erkannt wurde. Das können je nach UART im PC etliche Zeichen
sein, bei meinem meist 12.
Ich habe zwar für eine Geschichte Hardware-Handshake benutzt, Daten
abholen, Stop setzen, wenn Buffer voll, weiter Zeichen abholen bis ein
zusätzlicher Timeout zuschlägt. Geht zwar zuverläasig, war mir aber
eigentlich fast zuviel Aufwand.
Ich nehme für solche Sachen jetzt meist das gute alte XModem, das
schickt 128 Byte-Blöcke und wartet dann auf das ACK vom AVR.
Spart zusätzliche Leitungen und für einen 128Byte-Buffer ist bei mir
eigentlich immer Platz im AVR.
Gruß aus Berlin
Michael
>das liegt daran, das der Sender noch seinen Buffer rausschickt, nachdem>das "Stop" erkannt wurde. Das können je nach UART im PC etliche Zeichen>sein, bei meinem meist 12.
Genau, da können noch bis zu 16 Zeichen kommen wenn RTS
auf Stop gesetzt wird. Du brauchst also einen Puffer der
diese Zeichen aufnehmen kann.
hm, sehr nervig, ich meine, kein Problem mit dem Buffer, aber, wie
Michael schon schrieb, eigendlich zu viel Aufwand, nunja...
@holger: Wie kommst Du auf 16Byte?? Bei meinen Versuchen hier,
"verschluckt" er schon 19Byte. Gibt es da irgendeine Zahl nach der man
sich richten kann, so in der Art, sendet noch 10ms weiter, oder, sendet
maximal 2000Byte (die Zahl kommt im übrigen von Wikipedia, aber das kann
ja wohl unmöglich ernst gemeint sein ;-)
Gruß
Ralf
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.