Forum: Compiler & IDEs Arduino Nano Problem (Int to Char)


von Pete (Gast)


Lesenswert?

Moin
ich würde gerne ein Char Array bestehend aus einer Seriennummer und 
einem Steuerwert übergeben:

Seriennummer: SN#s48fa3asd4d
Steuerwert: 14

Zusammengesetzt soll folgendes über I2C ausgegeben werden: 
SN#s48fa3asd4d;14

Folgende Variablen werden verwendet:

#define I2C_ADDRESS_OTHER 0x2

int encoderPos = 14;
string serialNumber = "SN#s48fa3asd4d";

void setup() {
    Wire.begin();
}
void loop()
{
      Wire.beginTransmission(I2C_ADDRESS);
      char trasmit_c[1];
      String transmit_s = serialNumber + ";" + encoderPos;
      transmit_s.toCharArray(trasmit_c, 17);
      Wire.write(trasmit_c);
}


das komische ist, dass es bei einem Skript funktioniert und bei einem 
anderen nicht. Einmal wird ein linearer Regler ausgelesen (Steuerwert 
zwischen 0 und 100) und einmal ein Inkrementgeber (Steuerwert zwischen 
-1000 und +1000)

: Verschoben durch Moderator
von dummfrager (Gast)


Lesenswert?

Pete schrieb:
> ich würde gerne ........ übergeben:

An wen oder was bitte?

Pete schrieb:
> das komische ist, dass es bei einem Skript funktioniert und bei einem
> anderen nicht

Was funktioniert den genau nicht?

von Ganz Klar (Gast)


Lesenswert?

encoder Pos ist weder string noch char...

serialNumber + ";" + encoderPos
Das funktioniert in C(++) nicht...

von Pete (Gast)


Lesenswert?

An ein andere Gerät, die Datenübertragung funktioniert auch. Im 
Fehlerfall wird immer wieder die Setup-Routine aufgerufen. Ich weiß 
jedoch nicht warum. Wenn ich

      String transmit_s = serialNumber + ";" + encoderPos;

durch

      String transmit_s = serialNumber + ";" + "14";

ersetze, funktioniert alles.



Im Beispiel sind Seriennummer und Steuerwert fest, in echt ist der 
Steuerwert natürlich nicht statisch. Die Seriennummer wird nur einmalig 
vergeben und dann in den EEPROM geschrieben.

von Ganz Klar (Gast)


Lesenswert?

Und in trasmit_c[1] ist zu kurz...

von Pete (Gast)


Lesenswert?

Tatsache, ich hatte es im anderen Sketch probiert, da hatte es 
funktioniert. habe jetzt encoderPos durch String(encoderPos) ersetzt und 
es funktioniert. Ist natürlich plausibel dennoch wundere ich mich, warum 
es im anderen Sketch funktioniert hat.

Danke euch!

von Pete (Gast)


Lesenswert?

Was meinst du genau mit zu kurz ?

von BlaBla (Gast)


Lesenswert?

Pete schrieb:
> String transmit_s = serialNumber + ";" + "14";

Ja, weil jetzt "14" ein String ist.

von BlaBla (Gast)


Lesenswert?

Suche mal nach Function "itoa"

von Ganz Klar (Gast)


Lesenswert?

Pete schrieb:
> Was meinst du genau mit zu kurz ?

https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/tochararray/

Die Verwendung des Interfaces ist falsch. Entweder mit '1' aufrufen oder 
den buffer mit 17 Elementen erzeugen.

von Pete (Gast)


Lesenswert?

Achso das, das ist mir auch grad aufgefallen. Die Bufferlänge ist nun 
als transmit_s.length()+1 definiert. Das sollte  sowohl für 1 als auch 
1000 dann funktionieren.

Danke euch für die Hilfe !

von Mike R. (thesealion)


Lesenswert?

Wenn man schon die Arduino Strings benutzen will, kann man sich die 
transmit_c Variable auch komplett sparen und direkt den String an 
Wire.write() übergeben.

Oder man kann direkt das in String verwendete Char-Array nutzen (mittels 
.c_str())

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.