Bralph Posted January 31, 2013 at 08:02 PM Share Posted January 31, 2013 at 08:02 PM 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. Quote Link to comment Share on other sites More sharing options...
Bralph Posted January 31, 2013 at 09:27 PM Author Share Posted January 31, 2013 at 09:27 PM 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. Quote Link to comment Share on other sites More sharing options...
photron Posted February 1, 2013 at 09:28 AM Share Posted February 1, 2013 at 09:28 AM 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. Quote Link to comment Share on other sites More sharing options...
photron Posted February 1, 2013 at 10:50 AM Share Posted February 1, 2013 at 10:50 AM 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. Quote Link to comment Share on other sites More sharing options...
photron Posted February 1, 2013 at 12:19 PM Share Posted February 1, 2013 at 12:19 PM Okay, hier eine korrigierte Version zum Testen.tinkerforge_delphi_bindings_2_0_2_ca5b695c8174d4d75f180bb5460e61e1a2803129.zip Quote Link to comment Share on other sites More sharing options...
Bralph Posted February 1, 2013 at 04:30 PM Author Share Posted February 1, 2013 at 04:30 PM 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. Quote Link to comment Share on other sites More sharing options...
photron Posted February 4, 2013 at 12:45 PM Share Posted February 4, 2013 at 12:45 PM 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. Quote Link to comment Share on other sites More sharing options...
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.