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 to comment
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 to comment
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 to comment
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 to comment
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 to comment
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 to comment
Share on other sites

Wenn du sonst Java programmierst dann ist mein Tipp dabei zu bleiben :D

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ß

Link to comment
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 to comment
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.

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