Go Down

Topic: Anfänger:string zusammensetzen und wieder zerlegen (Read 6 times) previous topic - next topic

Madjoe

#5
Dec 16, 2010, 11:31 pm Last Edit: Dec 16, 2010, 11:34 pm by Madjoe1974 Reason: 1
hi jkw

dank deines tips habe ich jetzt mal folgenden code gebastelt

Code: [Select]

// Sticks 1-4

#include <Wire.h>

// ADC PINS deklarieren
int ADC0=0;
int ADC1=1;
int ADC2=2;
int ADC3=3;

//Kanäle deklarieren
int Kanal_1;
int Kanal_2;
int Kanal_3;
int Kanal_4;

//div deklarationen

char Geber_1[4];
char Geber_2[4];
char Geber_3[4];
char Geber_4[4];

void setup ()
{
 Serial.begin(57600);
 Wire.begin(1);                                // Starte i2c bus als Slave mit addresse #1
 Wire.onRequest(i2c_request);                  // I2C interrupt Routine i2c request
}

void loop()
{
 //Kanäle einlesen
 Kanal_1=analogRead(ADC0);
 Kanal_2=analogRead(ADC1);
 Kanal_3=analogRead(ADC2);
 Kanal_4=analogRead(ADC3);

 //Kanäle Rechnen
 
 
 // ausgabe vorbereiten
 
 sprintf(Geber_1,"%04i",Kanal_1);
 sprintf(Geber_2,"%04i",Kanal_2);
 sprintf(Geber_3,"%04i",Kanal_3);
 sprintf(Geber_4,"%04i",Kanal_4);

 // Werte Seriell ausgeben
 Serial.print(Geber_1);
 Serial.print(" - ");
 Serial.print(Geber_2);
 Serial.print(" - ");
 Serial.print(Geber_3);
 Serial.print(" - ");
 Serial.println(Geber_4);
 

}

void i2c_request()                                      //daten per i2c senden
{
//  char buffer[32];
//  Geber_sum.toCharArray(buffer, 32);
 Wire.send(Geber_1);
}



nur is mir da noch was unklar: warum auch immer hab ich jetzt folgende ausgabe per seriell:

Code: [Select]

0565048504910529 - 048504910529 - 04910529 - 0529
0564048504920529 - 048504920529 - 04920529 - 0529
0565048504910530 - 048504910530 - 04910530 - 0530
0565048504910529 - 048504910529 - 04910529 - 0529
0565048504910529 - 048504910529 - 04910529 - 0529
0565048504910529 - 048504910529 - 04910529 - 0529
0565048504910530 - 048504910530 - 04910530 - 0530
0565048504920529 - 048504920529 - 04920529 - 0529
0565048504910530 - 048504910530 - 04910530 - 0530
0565048504910530 - 048504910530 - 04910530 - 0530
0565048404910529 - 048404910529 - 04910529 - 0529
0565048504920530 - 048504920530 - 04920530 - 0530
0565048504910529 - 048504910529 - 04910529 - 0529
0565048504910529 - 048504910529 - 04910529 - 0529
0565048504910529 - 048504910529 - 04910529 - 0529



die ersten 16 zeichen sind in "Geber_1" gespeichert und enthält aus mir unerfindlichen gründen alle kanäle von 1-4
die 2.te sequenz (Geber_2)mit 12 zeichen enthält die kanäle 2-4
die 3.te sequenz (Geber_3)mit 8 zeichen enthält die Kanäle 3,4
und einzig die 4.te sequenz(Geber_4) mit 4 Zeichen ist eigentlich korrekt und enthält nur den 4. Kanal

ich erkenne zwar das muster das dahintersteckt nur hab ich momentan keinen plan ... hab mir zar die englische referenz zu sprintf reingezogen nur blick ich die nicht ganz...

so wie ich das verstehe interagiert die erste sprintf anweisung mit allen nachfolgenden....

kommt mir vor wie bei ner seriellen ausgabe wo alles aneinander gereiht wird bis das Serial.println kommt

liege ich da richtig?

übrigens danke für deine hilfe.....

lg joe

edit: nachdem ich jetzt den code von den switch schleifen und unnötigen variablen befreit habe... ist der code sogar um einiges kleiner geworden  :D

jkw

ist doch super ( das mit dem kleiner )
jetzt würde ich folgendes vorschlagen:


statt 4 buffer variablen und 4 sprintf's machste:

Code: [Select]
// Sticks 1-4

#include <Wire.h>

// ADC PINS deklarieren
int ADC0=0;
int ADC1=1;
int ADC2=2;
int ADC3=3;

//Kanäle deklarieren
int Kanal_1;
int Kanal_2;
int Kanal_3;
int Kanal_4;

//div deklarationen

char Buffer[20];

void setup ()
{
 Serial.begin(57600);
 Wire.begin(1);                                // Starte i2c bus als Slave mit addresse #1
 Wire.onRequest(i2c_request);                  // I2C interrupt Routine i2c request
}

void loop()
{
 //Kanäle einlesen
 Kanal_1=analogRead(ADC0);
 Kanal_2=analogRead(ADC1);
 Kanal_3=analogRead(ADC2);
 Kanal_4=analogRead(ADC3);

 //Kanäle Rechnen
 
 
 // ausgabe vorbereiten
 
 sprintf(Buffer,"%04i - %04i - %04i - %04i",Kanal_1,Kanal_2,Kanal_3,Kanal_4);

 // Werte Seriell ausgeben
 Serial.println(Buffer);
 

}

void i2c_request()                                      //daten per i2c senden
{
//  char buffer[32];
//  Geber_sum.toCharArray(buffer, 32);
 Wire.send(Geber_1);
}



alles in einem. ... dann sollte dieses merkwürdige, mir unerklärlich verhalten aufhören ;)

Gruß JKW

Madjoe

hi

hey super ja jetzt tut es... genial... ich danke dir recht herzlich das du mich an der hand genommen hast... :)

mich würd es jetzt zwar doch brennend interessieren warum das mit den 4 sprintf so komisch tat aber ok

lg Joe


jkw

Und mich erst, normalerweise gibt's nur erstaunlich Ergebnisse wenn man z.b. Sowas macht
unsigned Long Test=123;
Char Buffer[10];
sprintf(Buffer,"%i",Test);

wobei das ja nun definitiv ein programmierfehler ist hab ich mich schon öfters über sowas gewundert ;)

Freut mich das es läuft.
Gruß JKW

Madjoe

mach mich schlau... wo liegt da der programmier fehler? da fehlt was bei "%i" oder?

lg joe

Go Up