est Bewegung durch eine 3D-Landschaft mit ... - David Zaadstra
est Bewegung durch eine 3D-Landschaft mit ... - David Zaadstra
est Bewegung durch eine 3D-Landschaft mit ... - David Zaadstra
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Projektarbeit 2002, BKIK 2/1<br />
<strong>David</strong> <strong>Zaadstra</strong>, Alexander Fuchs<br />
<strong>Bewegung</strong> <strong>durch</strong> <strong>eine</strong> <strong>3D</strong>-<strong>Landschaft</strong> <strong>mit</strong> Fernbedienung<br />
Elektronikschule Tettnang<br />
Das Problem ist, dass es standardmäßig beim Lesen und Schreiben auf die Schnittstelle<br />
k<strong>eine</strong>n Timeout gibt. D.h. wenn wir ein Byte lesen wollen, aber k<strong>eine</strong>s vorhanden ist, bleiben<br />
wir in der ReadFile-Funktion hängen bis ein Byte kommt. Dies ist natürlich nicht erwünscht.<br />
Deshalb setzen wir den Timeout so, dass ein Byte zurückgeliefert wird, sofern es vorhanden<br />
ist. Ansonsten soll es direkt weitergehen <strong>mit</strong> dem Programm.<br />
Der Timeout wird folgendermaßen verändert:<br />
CODE:<br />
COMMTIMEOUTS timeout;<br />
if(!GetCommTimeouts(com, &timeout))<br />
{<br />
// hier Fehlerbehandlung einfügen<br />
}<br />
timeout.ReadTotalTimeoutConstant = 1;<br />
timeout.ReadTotalTimeoutMultiplier = 0;<br />
timeout.ReadIntervalTimeout = 1;<br />
if(!SetCommTimeouts(com, &timeout))<br />
{<br />
// hier Fehlerbehandlung einfügen<br />
}<br />
Der ReadIntervalTimeout gibt an, wie viel Zeit zwischen der Ankunft von 2 Bytes<br />
verstreichen darf, die ReadTotalTimeoutConstant gibt an, wie lange der Lesevorgang<br />
insgesamt dauern darf.<br />
Optimal wäre natürlich ein Wert von 0. Dieser ist jedoch reserviert und bedeutet, dass es<br />
k<strong>eine</strong>n Timeout gibt. Deshalb werden beide Werte auf 1 gesetzt. Da<strong>mit</strong> hätten wir aber immer<br />
noch 1ms Wartezeit, was zwar nicht sehr viel ist, den Programmfluss aber dennoch<br />
verlangsamt. Deshalb wird der ReadTotalTimeoutMultiplier auf 0 gesetzt. Wie am Namen<br />
unschwer zu erkennen ist, stellt diese Variable <strong>eine</strong>n Vervielfacher dar. So<strong>mit</strong> werden die<br />
Timeout-Werte <strong>mit</strong> 0 multipliziert, wo<strong>durch</strong> wir das gewünschte Verhalten erzielt haben: Ist<br />
ein Zeichen da, lesen wir es, ansonsten wird die Funktion direkt verlassen.<br />
- 48 -