Bralph Geschrieben January 31, 2013 at 20:02 Geschrieben January 31, 2013 at 20:02 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. Zitieren
Bralph Geschrieben January 31, 2013 at 21:27 Autor Geschrieben January 31, 2013 at 21:27 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. Zitieren
photron Geschrieben February 1, 2013 at 09:28 Geschrieben February 1, 2013 at 09:28 Ich kann das TArray0To2OfUInt8 Problem reproduzieren. Ich könnte schwören ich hab das vor Release alles getestet und es hat funktioniert auch mit Delphi XE2. Ich bin gerade dabei das zu fixen. Zitieren
photron Geschrieben February 1, 2013 at 10:50 Geschrieben February 1, 2013 at 10:50 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. Zitieren
photron Geschrieben February 1, 2013 at 12:19 Geschrieben February 1, 2013 at 12:19 Okay, hier eine korrigierte Version zum Testen.tinkerforge_delphi_bindings_2_0_2_ca5b695c8174d4d75f180bb5460e61e1a2803129.zip Zitieren
Bralph Geschrieben February 1, 2013 at 16:30 Autor Geschrieben February 1, 2013 at 16:30 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. Zitieren
photron Geschrieben February 4, 2013 at 12:45 Geschrieben February 4, 2013 at 12:45 Ups, da ist mir doch eine Teständerung mit dem Leerzeichen entwischt. Beim Move hast du recht, ich habe den Kommentar entsprechend angepasst. Mit Delphi Bindings Version 2.0.3 sollten jetzt alle genannten Probleme behoben sein. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.