Einstein Geschrieben May 8, 2012 at 00:09 Geschrieben May 8, 2012 at 00:09 Hallo Leute, ich hoffe mir kann jemand von euch weiterhelfen. Ich weiß nicht ob ich nur auf dem Schlauch stehe aber mein Code will immer nur eine Connection herstellen... Die UID sind definitiv korrekt, wenn ich sie einzeln teste funktioniert es aber alle 3 zusammen gehen nicht. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #include <unistd.h> #include <iostream> #include <string> #include "lib/ip_connection.h" #include "lib/bricklet_temperature_ir.h" #include "lib/bricklet_lcd_20x4.h" #include "lib/bricklet_ambient_light.h" #define HOST "localhost" #define PORT 4223 /*#define UID_al "XXX" #define UID_lcd "XXX" #define UID_tir "XXX" // Change to your UID*/ using namespace std; /********************************* ** MAIN ** ** ** *********************************/ int main(int argc, char* argv[]) { // Create ip connection to brickd IPConnection ipcon; if(ipcon_create(&ipcon, HOST, PORT) < 0) { fprintf(stderr, "Could not create connection\n"); exit(1); } // Create device object char* UID_tir = argv[1]; char* UID_al = argv[2]; char* UID_lcd = argv[3]; // Add device to ip connection TemperatureIR tir; temperature_ir_create(&tir, UID_tir); if(ipcon_add_device(&ipcon, &tir) < 0) { fprintf(stderr, "Could not connect to IR_Temp\n"); exit(1); } AmbientLight al; ambient_light_create(&al, UID_al); int amb_temp = ipcon_add_device(&ipcon, &al); if(amb_temp < 0) { fprintf(stderr, "Could not connect to Ambient Light\n"); printf("%i", amb_temp); exit(1); } LCD20x4 lcd; lcd_20x4_create(&lcd, UID_lcd); if(ipcon_add_device(&ipcon, &lcd) < 0) { fprintf(stderr, "Could not connect to LCD\n"); exit(1); } Hat jemand eine Idee? Gruß Zitieren
AuronX Geschrieben May 8, 2012 at 07:32 Geschrieben May 8, 2012 at 07:32 Verstehe ich dich richtig, dass im gezeigten Code die erste Verbindung hergestellt wird und der Code dann den zweiten if-Zweig ansteuert? Falls es zu compile-fehlern kommt: ich denke, dass deine defines ganz oben möglicherweise NICHT auskommentiert sind. Zumindest dachte ich bisher, dass der präprozessor sich nciht für kommentare interessiert... das würde bedeuten, dass UID_lcd und UID_tir durch deine UIDs ersetzt würden, das würde wiederum hier krachen: char* UID_tir = argv[1]; char* UID_al = argv[2]; char* UID_lcd = argv[3]; Allerdings bin ich kein C++-Fan, dementsprechend kann ich mich auch irren ^^ Zitieren
photron Geschrieben May 8, 2012 at 07:44 Geschrieben May 8, 2012 at 07:44 Du meinst, dass das erste ipcon_add_device für das TemperatureIR funktioniert die nachfolgenden aber fehlschlagen? Ich hab das hier gerade mal getestet und bei mir funktioniert das ohne Probleme unter Linux mit den C Bindings in Version 1.0.5 (von gestern: http://download.tinkerforge.com/bindings/c/tinkerforge_c_bindings_1_0_5.zip). Hast du das Problem unter Windows oder mit einer alten Version der C Bindings? Hilft es wenn du zwischen den ipcon_add_device Aufrufen ein sleep von 1 sec einbaust? Zitieren
Einstein Geschrieben May 8, 2012 at 10:44 Autor Geschrieben May 8, 2012 at 10:44 Du meinst, dass das erste ipcon_add_device für das TemperatureIR funktioniert die nachfolgenden aber fehlschlagen? Ich hab das hier gerade mal getestet und bei mir funktioniert das ohne Probleme unter Linux mit den C Bindings in Version 1.0.5 (von gestern: http://download.tinkerforge.com/bindings/c/tinkerforge_c_bindings_1_0_5.zip). Hast du das Problem unter Windows oder mit einer alten Version der C Bindings? Hilft es wenn du zwischen den ipcon_add_device Aufrufen ein sleep von 1 sec einbaust? Ich programmiere eigentlich in Java daher vielleicht auch mein schlechter Code. Compileerrors erhalte ich keine und mit Sleep von 1s funktioniert es auch. Gibt es eine Möglichkeit diese Initialisierung noch schneller ablaufen zu lassen? Gruß EDIT: ich hab zwischendrin ein usleep(2000) eingebaut und nun ist es etwas fixer. P.S.: ich bin unter linux unterwegs, nix mit windows Zitieren
photron Geschrieben May 8, 2012 at 10:57 Geschrieben May 8, 2012 at 10:57 Es muss auch ohne die sleeps funktionieren und das tut es hier auch. Ich hatte das vorgeschlagen weil jemand ein ähnliches Problem hatte und ihm sleeps geholfen haben. Das war allerdings vor meiner Zeit. Tritt das Problem auf Linux, Windows oder Mac OS auf? Tritt das Problem auch mit der aktuelle Version 1.0.5 der C Bindings auf? Nur wenn ich das Problem reproduzieren kann kann ich es auch beheben Zitieren
Einstein Geschrieben May 8, 2012 at 11:03 Autor Geschrieben May 8, 2012 at 11:03 Ich hatte es oben noch einmal editiert, wenn ich 2ms schlafe geht es. Ich bin unter Linux unterwegs. Ich hänge mal den kompletten Quelltext an. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #include <unistd.h> #include <iostream> #include <string> #include "lib/ip_connection.h" #include "lib/bricklet_temperature_ir.h" #include "lib/bricklet_lcd_20x4.h" #include "lib/bricklet_ambient_light.h" #define HOST "localhost" #define PORT 4223 using namespace std; /********************************* ** MAIN ** ** ** *********************************/ int main(int argc, char* argv[]) { // Create ip connection to brickd IPConnection ipcon; if(ipcon_create(&ipcon, HOST, PORT) < 0) { fprintf(stderr, "Could not create connection\n"); exit(1); } // Create device object char* UID_tir = argv[1]; char* UID_al = argv[2]; char* UID_lcd = argv[3]; // Add device to ip connection TemperatureIR tir; temperature_ir_create(&tir, UID_tir); if(ipcon_add_device(&ipcon, &tir) < 0) { fprintf(stderr, "Could not connect to IR_Temp\n"); exit(1); } usleep(100); AmbientLight al; ambient_light_create(&al, UID_al); int amb_temp = ipcon_add_device(&ipcon, &al); if(amb_temp < 0) { fprintf(stderr, "Could not connect to Ambient Light\n"); printf("%i", amb_temp); exit(1); } usleep(100); LCD20x4 lcd; lcd_20x4_create(&lcd, UID_lcd); if(ipcon_add_device(&ipcon, &lcd) < 0) { fprintf(stderr, "Could not connect to LCD\n"); exit(1); } // Don't use device before it is added to a connection // Get current ambient and object temperatures (unit is °C/10) int16_t obj; int16_t amb; uint16_t illuminance; while(1) { sleep(1); if(ambient_light_get_illuminance(&al, &illuminance) < 0) { fprintf(stderr, "Could not get value, probably timeout\n"); exit(1); } ambient_light_get_illuminance(&al, &illuminance); temperature_ir_get_object_temperature(&tir, &obj); temperature_ir_get_ambient_temperature(&tir, &amb); lcd_20x4_write_line(&lcd, 0, 0, "Temperatur: "); lcd_20x4_write_line(&lcd, 1, 0, "Sensor: "); lcd_20x4_write_line(&lcd, 2, 0, "Helligkeit: "); lcd_20x4_backlight_on(&lcd); printf("%f:%f", obj/10.0, amb/10.0); printf("\n %f", illuminance/10.0); printf("\n"); } //printf("Ambient Temperature: %f °C\n", amb/10.0); //printf("Press ctrl+c to close\n"); //ipcon_join_thread(&ipcon); // Join mainloop of ip connection } Ich habs mittlerweile runtergebrochen bis auf 100µs. Gruß EDIT: egal was ich dazwischenschreibe es muss etwas dazwischen. Aktuell steht 1µs dazwischen. Zitieren
AuronX Geschrieben May 8, 2012 at 11:13 Geschrieben May 8, 2012 at 11:13 Wenn du sonst Java programmierst dann ist mein Tipp dabei zu bleiben Zitieren
Einstein Geschrieben May 8, 2012 at 11:29 Autor Geschrieben May 8, 2012 at 11:29 Wenn du sonst Java programmierst dann ist mein Tipp dabei zu bleiben In Java funktioniert auch das Programm ohne Probleme, jedoch ist es für ein embedded Gerät und dort läuft Java ohne MMU nur sehr langsam und mehr schlecht als recht. Gruß Zitieren
photron Geschrieben May 8, 2012 at 11:52 Geschrieben May 8, 2012 at 11:52 EDIT: egal was ich dazwischenschreibe es muss etwas dazwischen. Aktuell steht 1µs dazwischen. Es wird dann auch ein usleep(0) tun. Der Punkt ist dann nicht das Warten an sich sondern, dass das usleep() dazu führt dass der Scheduler einen anderen Prozess dran nimmt. Warum auch immer das einen Unterschied macht. Du sprichst von einem embedded Gerät. Testest du das Programm auch gerade dort, oder auf einem normalen Desktop Rechner? Du hast noch nicht gesagt welche C Bindings Version du verwendest und ob das Problem auch mit der aktuellen Version 1.0.5 auftritt. Zitieren
Einstein Geschrieben May 8, 2012 at 11:59 Autor Geschrieben May 8, 2012 at 11:59 Ohh entschuldige das hatte ich vergessen. Ich hab die aktuellen bindings vorhin runtergeladen und ich teste es auch auf dem Embeddedgerät selber inklusive compilieren. Gruß Zitieren
photron Geschrieben August 1, 2012 at 16:34 Geschrieben August 1, 2012 at 16:34 Das Problem lag an einer Race Condition in der add_device Funktion. Das sleep hat die Race Condition aufgehoben. In den aktuellen Bindings ist das Problem korrigiert. Zitieren
Einstein Geschrieben August 1, 2012 at 17:08 Autor Geschrieben August 1, 2012 at 17:08 Ich hatte die anderen Threads mitverfolgt. Trotzdem thx. 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.