Jump to content

[Delphi] Fehler in BrickStepper.pas


Recommended Posts

Die Typdefinition

TArray0To2OfUInt8 = array [0..2]of byte

müsste in der Unit BrickStepper.pas gelöscht werden da diese bereits in der Unit Device.pas definiert ist. Der Compiler (Delphi XE2) stellt sonst in der Prozedur GetIdentity eine Unterscheidung fest. Das Problem besteht wahrscheinlich noch vielen weiteren Units.

Link to comment
Share on other sites

Ich habe noch einige Probleme mit den Delphi Bindings.

Mein Beispielcode sieht derzeit so aus:

ipcon := TIPConnection.Create;
stepper := TBrickStepper.Create(UID, ipcon);
ipcon.Connect(HOST, PORT);
label1.caption:= inttostr(stepper.GetChipTemperature); 

Zum einem lassen sich die Bereichsüberprüfung und Überlaufprüfung in den Compileranweisungen nicht aktivieren ohne dementsprechende Fehler zu provozieren.

Z..B. hier (TIPConnection.ReceiveLoop):

Move(pendingData[len], pendingData[0], Length(pendingData) - len);

Ok kann man abschalten und akzeptieren, aber besonders schön ist das nicht.

Die Chip Temperatur die ausgelesen wird liegt bei ca. -28°C. Nicht wirklich realistisch! Wenn man etwas genauer hinsieht gibt es hier Probleme:

function LEConvertUInt16From(const offset: longint; const data: TByteArray): word;
begin
  result := word(data[offset + 0]) shl 0 or word(data[offset + 1]) shl 8;
end;

OK ein Beispiel: data[8] hat den Wert 225 (225/10= 22.5°C was passen würde). Der Rückgabewert ist mit den Ganzen shl Verschiebungen leider 65508. Diesen Wert kann die endgültige Rückgabefunktion LEConvertInt16From nicht mehr verarbeiten (Überlauf da smallint was nur bis grob 32000 geht). Macht dann – 28°C. mmmh schlecht.

 

Link to comment
Share on other sites

Ich habe noch einige Probleme mit den Delphi Bindings.

Mein Beispielcode sieht derzeit so aus:

ipcon := TIPConnection.Create;
stepper := TBrickStepper.Create(UID, ipcon);
ipcon.Connect(HOST, PORT);
label1.caption:= inttostr(stepper.GetChipTemperature); 

Zum einem lassen sich die Bereichsüberprüfung und Überlaufprüfung in den Compileranweisungen nicht aktivieren ohne dementsprechende Fehler zu provozieren.

Z..B. hier (TIPConnection.ReceiveLoop):

Move(pendingData[len], pendingData[0], Length(pendingData) - len);

Ok kann man abschalten und akzeptieren, aber besonders schön ist das nicht.

 

Okay, Move mit Länge 0 aufzurufen führt zu einen ERangeCheck. Das halte ich für übertrieben, da das an sich gültig ist. Aber ich habe jetzt einen extra Check ein gebaut um Move nur mit Längen > 0 aufzurufen.

 

Die Chip Temperatur die ausgelesen wird liegt bei ca. -28°C. Nicht wirklich realistisch!

 

Doch das kann durchaus sein. Die Chip Temperatur ist nur proprtional zu wirklichen Temperatur. Der Wert kann einen solchen Offsetfehler haben. Wenn du den Mikrocontroller anwärmst, z.B. mit dem Daumen, dann solltest du die Temperatur steigen sehen. Wenn du mehrere Bricks da hast wirst du feststellen, das der Offsetfehler der Chip Temperatur eine große Streuung hat. Die Chip Temperatur ist daher nur dafür gut Temperaturveränderungen zu erkennen, aber nicht dafür geeignet die absolute Temperatur zu messen.

 

Wenn man etwas genauer hinsieht gibt es hier Probleme:

function LEConvertUInt16From(const offset: longint; const data: TByteArray): word;
begin
  result := word(data[offset + 0]) shl 0 or word(data[offset + 1]) shl 8;
end;

OK ein Beispiel: data[8] hat den Wert 225 (225/10= 22.5°C was passen würde). Der Rückgabewert ist mit den Ganzen shl Verschiebungen leider 65508. Diesen Wert kann die endgültige Rückgabefunktion LEConvertInt16From nicht mehr verarbeiten (Überlauf da smallint was nur bis grob 32000 geht). Macht dann – 28°C. mmmh schlecht.

 

Das ist richtig so wie es da implementiert ist. Was da allerdings fehlt sind explizite Casts für die Zuweisungen die Overflowen können, da sonst ERangeCheck Fehler auftreten können.

Link to comment
Share on other sites

Danke für die Überarbeitung. Ein kleines Leerzeichen ist noch zu viel in Unit LEConverter:

function LEConv ertBooleanFrom(const offset: longint; const data: TByteArray): boolean;

 

Danke für den Hinweis mit dem Offset. Ich hätte nicht gedacht dass der so groß ist.

Leider passt auch die Steigung nicht ganz. Die Linearität ist OK, wie man an der Messreihe sieht (Vergleich interner / externen angelegter Temperatursensor). Die Steigung ist nicht 1 sondern liegt bei etwa 0.5. Scheint irgendwo noch ein Faktor 2 zu fehlen.

 

Und noch ein kurzer Hinweis zur der einen Move Zeile (erster Post):

Move(pendingData[len], pendingData[0], Length(pendingData) - len);

Das Problem ist glaub ich nicht die Verschiebung um Null sondern das Array pendingData hat Indices von 0..9. len hat in diesem Fall den Wert 10 versucht auf die entsprechende nicht vorhandene Position zuzugreifen.

Messung.jpg.e334b5418d0857bd9f9cc1eda0341808.jpg

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...