ich bastel gerade an einem 433Mhz-Sender (Arduino Uno) der ein paar Sensorwerte an einen 433 Empfänger (Arduino Ethernet) schickt.
Ich nutze da die VirtualWire-Bibliothek, die per Standard einen char-String frisst.
Ich wandle mir einen Float-Temperaturwert wie folgt in einen passenden Char um:
Das funktioniert auch. Mein Problem ist nun; ich würde gerne diesen Char-String manipulieren - also am einfachsten einen anderen davor oder danach dranhängen.
Mit Strings funktioniert das wohl; mit Char habe ich da nichts gefunden, und im Test zum Verketten von Char's mit "+" gab's nur Fehlermeldungen.
Momentan hänge ich HINTEN dran ein "N1", was für "Node 1" stehen soll:
// Node-ID anhängen. Format: xx.yy;NX
// xx.yy = Temperatur, ;=Seperator, N steht für "Node", X für die Node-ID
msg[5] = ';';
msg[6] = 'N';
msg[7] = NODEID;
msg[8] = '\0'; // Char terminieren
Das ist weder schön, noch gut in der Handhabung. Ich hätte das N1; gerne am ANFANG; dafür müsste ich aber - zumindest ist das die einzige Möglichkeit, die mir da gerade einfällt - alle Werte im Array von der Position 3 nach hinten schreiben, und mein N1; auf die ersten drei Array-Pläte 0-2 schreiben.
Ich poste hier unter Vorbehalt, weil es durchaus sein kann, dass es nicht exakt Dein Problem trifft, aber manchmal helfen auch kleine Hinweise, die nicht 100%ig passen.
Ich hatte für die Ausgabe eines Strings für einen Musikserver den Befehl snprintf benutzt, da man dort innerhalb eines vorgegbenen Strings bestimmte Variablen veränderbar einsetzen kann.
SBox ist der Speicher mit einer Größe von 150 Byte max, in den der in " " stehende Begriff mit Platzhaltern für Variablen steht. Die Variablen selbst stehen anschließend in der Reihenfolge der Platzhalter. (%%20 sind Leerzeichen, %s ein string und in den sechs %02x steht eine Mac-Adresse.
msg[0] = 'N'; // setzt einen Buchstaben an den Anfang
msg[1] = 'T';
msg[2] = ' '; // Leerzeichen müsseen auch gesetzt werden
dtostrf(temperature, 2, 2, msg+3); // schreibt das Ergebnis etwas weiter hinten
Musst nur aufpassen, dass in der Mitte keine 0 (Binär) bleibt, das ist das EndeKennzeichen des Textes.
msg[0] = 'N'; // setzt einen Buchstaben an den Anfang
msg[1] = 'T';
msg[2] = ' '; // Leerzeichen müsseen auch gesetzt werden
dtostrf(temperature, 2, 2, msg+3); // schreibt das Ergebnis etwas weiter hinten
Musst nur aufpassen, dass in der Mitte keine 0 (Binär) bleibt, das ist das EndeKennzeichen des Textes.
Hallo und vielen Dank für diese Lösung!
Das ich mit +3 das Schreiben "nach hinten setzen" kann, wusste ich nicht - aber das ist eine Lösung, die mir gefällt, weil ich keine zusätzlichen Libs o.ä. brauche.
Du brauchst auch für andere Varianten keine extra Libs, bzw. du musst sie nicht per Hand einbinden. string.h ist automatisch inkludiert. Genauso wie stdlib.h welche die dstrof()-Funktion enthält
eberduino:
Da ich nur ein Anfänger bin, beschäftigt mich die Frage, ob es nicht auch wie folgt geht:
Wenn das zu sendende Telegramm msg 24 byte lang sein darf und doch vermutlich immer gleich aussehen soll, würde ich das Datentelegramm erzegen mit
snprintf(msg, 24, "N%d,%s Grad", NODEID, temp) ;
Ausgabebeispiel: "N1,27.35 Grad"
Dabei ist NODEID ein integer-Wert und temp der bereits umgewandelte Temperaturstring.
Was würde dagegen sprechen?
Eberhard
Das hört sich gut an. Warum ich nicht drauf kam? Steck noch nicht so tief in der Materie
Ich bin es "gewöhnt" - vermutlich von "aktuellen" Sprachen verwöhnt - dass man sich nicht so oft mit dem Umwandeln von Dateitypen beschäftigen muss. Zumindest bei AutoIT, mit dem ich in den letzten Jahren viel gemacht hab, spuckt da keine großen Fehlermeldungen aus.
Aber ich werde das mal prüfen Verkürzt den Code - und da ich nur 8 kb habe...