Jump to content

Probleme mit C++


Recommended Posts

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ß

Link zu diesem Kommentar
Share on other sites

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 ^^

Link zu diesem Kommentar
Share on other sites

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?

Link zu diesem Kommentar
Share on other sites

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 ;)

Link zu diesem Kommentar
Share on other sites

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 :)

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

  • 2 months later...

Join the conversation

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

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...