Nagnarok schrieb:
> Und was würdest du an seiner Stelle andern?
> Er hat doch geschrieben das die Botschaften unterschiedlich lang sind.
> Da wird er ein "Timeout" benötigen.
Nein, das ist natürlich nicht zwingend. Man kann ein Protokoll
definieren, welches auf UART aufsetzt und einen Timeout zur
Nachrichtensynchronisation benutzt, aber man muß das keinesfalls tun.
Einfach deshalb, weil es noch andere Möglichkeiten gibt, Nachrichten
voneinander abzugrenzen. Und diese sind bezüglich UART als Medium
durchaus sehr viel weiter verbreitet die Arbeit mit Timeouts. Man denke
nur an die klassischen Zeilentrenner...
Die Frage ist einfach nur, welche der grundsätzlichen Möglichkeiten (mit
noch viel mehr Varianten) denn nun der Sender tatsächlich benutzt...
Oder anders ausgedrückt: Es kann keinen allgemeinen Code geben, der das
auf Empfängerseite leisten kann. Der Code muß entweder genau wissen, wie
der Sender seine Nachrichten trennt, nur dann kann er wirklich einzelne
Nachrichten an die nächste Softwareschicht weiter reichen oder es muß
ihm völlig egal sein, dann kann er nur einen (üblicherweise gepufferten)
Bytestrom weiter reichen, aus dem dann die nächste Softwareschicht
liest, die dann (hoffentlich) die Kriterien kennt, um die Nachrichten
voneinander zu trennen.
Wenn man physische Eigenheiten der UARTs zur Nachrichtentrennung
verwendet, muß natürlich logischwerweise die unterste Softwareebene auch
die Nachrichtentrennung vornehmen, denn höhere Ebenen bekommen davon ja
garnix mehr mit. Beim Timeout ist das schon schwieriger zu entscheiden,
der kann ganz unten verwaltet werden, aber auch eine Ebene höher. Er muß
dann aber wahrscheinlich etwas länger sein, um zuverlässig als
Nachrichtentrenner dienen zu können.
Wenn aber, wie weithin üblich, eine frame- oder trennzeichenbasierte
Nachrichtentrennung vorgenommen wird, dann kann die Sache zuverlässig in
höheren Schichten der Software erfolgen. Dann kann es auch eine
universelle UART-Routine geben. Und nur dann!
Genau das wäre die üblichste Implementierung. Eine Schicht unten, die in
einen FIFO liest, und eine Schicht darüber, die den vom FIFO gelieferten
Datenstrom in Inhalte aufdröselt. Genau so arbeiten alle normalen OS.
Und nur mit einem gewissen Faktendruck wird man sinnvollerweise von
diesem Schema abweichen wollen...
Timeouts brauch man übrigens oft auch dann, wenn die Nachrichtentrennung
nicht über selbige erfolgt. Aber das sind dann schon Sachen, die sich
auf höheren Protokollebenen abspielen.