Mein Problem ist, das meine Ausgabe jetzt so in etwa aussieht:
yyyy
yyyy
yyyy
yyyy
Wenn ich die Abfrage des Null-Byte raus nehme und am Slave auch keines Sende, dann erhalte ich zwar die richtigen Werte, allerdings nacheinander:
3
.
4
5
3
.
4
5
3
Was macht der Arduino da mit den chars die ich auf dem Bus schicke? Bzw wie bekomme ich das hin das ich die Werte in einen String bzw ein charArray bekomme?
wenn Uwe den gesamten Sketch wünscht, was immer sinnvoll ist, der Fehler steckt öfters woanders als man denkt, solltest Du uns den geben. Dein Hauptproblem wird aber sein, dass Du die ankommenden Bytes nicht in ein char einliest und dieses dann ausgibts. Deswegen bestimmt die Einzelausgabe.
das dümmste was du jetzt machen kannst ist nur das setup zu posten. Wenn dann alles zusammen.
Entweder bei kurzen Sketchen alles in Code Tags oder die .ino ranhängen.
Mittels Wire.read() wird immer nur ein Byte über I2C gelesen. Wenn Du ein Zeichen gelesen hast, gibst Du es gleich mit Serial.println(Display) wieder aus.
Logisch gehört Serial.println() hinter die schließende Klammer von while(), weil Du wahrscheinlich in der while-Schleife aus den gelesenen Bytes einen String zusammenstellen willst, der dann danach zusammen ausgegeben werden soll.
Ob der Ansatz, einen String zusammenzustellen oder einzelne Zeichen auszugeben, richtig ist, hängt davon ab, ob der String weiterverarbeitet werden soll. Wenn das nicht so wäre, könntest Du Serial.println durch Serial.print ersetzen und hinter der while-Schleife mit Serial.println() die Zeile abschließen. Die Anzeige wäre dann in einer Zeile, c-Stilisten fänden dann allerdings noch Verbesserungspotenzial.
Das Programm ist schon ein wenig gewachsen, deshalb habe ich es mal auf das wesentlich zusammengekürzt.
Die Variable "Display" soll, wie der Name schon sagt, später auf einem Display erscheinen. Wenn ich die so einfach auf das Display lege, wird das Display einfach mit zahlen voll geschrieben.
Ziel ist es, einen Wert wie Beispielsweise "3.56" auf das Display zu legen.
Die einzelnen Bytes nacheinander oder untereinander auszulesen [print(ln)] funktioniert - solange kein Null-Byte ('\n') gesendet wird, in dem Fall tauchen immer die "yyyy" auf.
warum zeigst Du nicht den gesamten Code? Wenn zu groß, häng die .ino ran.
Dein Problem wird sein, das Du zwar char Paket auf 6 Byte definiert hast, aber beim einlesen der Zeichen den Index nicht änderst. Darum wirst Du wohl immer die gleichen Stelle im char array überschreiben und ausgeben. Zeig doch mal den gesamten Code her. Das char array muß auch um eins größer sein wie benötigt, weil die unsichtbare 0 als Endeerkennung noch reinpassen muß.
Habe ein zweizeiliges Display angeschlossen, in der oberen Zeile kann ich zwischen "Days", "Wochentagen" und "Wire" wählen. Währen beispielsweise in der oberen Zeile "Days" angewählt ist, kann ich in der unteren Zeile die Wochentage von Monday bis Sunday durchschalten. Wenn "Wochentage" angewählt ist, kann ich diese dann auf deutsch durchschalten. Das ganze dient bisher lediglich zu Übungszwecken.
Bei dem Menüpunkt "Wire" soll dann in der unteren Zeile der Wert der Spannung des Slave Arduino angezeigt werden.
Bis auf dem Datensalat auf dem Bus funktioniert das ganze aber schon ganz gut.
Meine Lösung will ich euch natürlich nicht vorenthalten, evtl steht ja mal einer vorm selben Problem.
Über Verbesserungsvorschläge von den Profis freue ich mich natürlich auch.
Also dann; da ich meinem Code eh ein wenig mehr Struktur geben will, habe ich das Lesen vom Bus in eine eigene Funktion gepackt:
void readBus()
{
Wire.requestFrom(2, 5);
char w = Wire.read();
char x = Wire.read();
char y = Wire.read();
char z = Wire.read();
int h = x - '0' ; //Beispiel um ein einzelnes char in ein Integer-Wert zu schreiben
char Paket[5] = {w, x, y, z} ; //Paket enthält jetzt die ankommenden chars inklusive "."
char Paket4[4] = {w, y, z} ; //Paket 4 enthält lediglich die Zahlenwerte (lässt sich dadurch später
//für weitere Berechnungen in ein Integer-Wert umwandeln
intval = atoi(Paket4) ; //Erstellt den Integer-Wert aus char Paket4
Display = Paket; //Erstellt einen String zur Ausgabe auf dem Display
}
Was mir noch nicht so ganz klar ist: Ein "char" nimmt laut Definition nur ein Zeichen auf. Ich definiere aber Beispielsweise char Paket mit 5 Byte Größe und kann dadurch mehrere Zeichen aufnehmen, was ja eigentlich einem char-Array entspricht.
Habe das ganze auch mit einem char-Array getestet, lässt sich aber nicht so einfach handeln bzw hatte dann zum Teil wieder Datensalat.
Den kompletten code gibts im Anhang.
(edit: Display ist global als String definiert, ist im geposteten code nicht ersichtlich)
Mindestens würde ich die char arrays so definieren:
char Paket[5] = {w, x, y, z, 0} ;
lokale Variable werden nicht mit 0 initialisiert, dass du Paket als string verwenden kannst, wäre also nicht sicher. ( Kann natürlich sein, dass bei dir kein Fehler sichtbar ist, aber du willst es ja als "Lösung" verwenden und nicht als "Falle" ).
Was mir noch nicht so ganz klar ist: Ein "char" nimmt laut Definition nur ein Zeichen auf. Ich definiere aber Beispielsweise char Paket mit 5 Byte Größe und kann dadurch mehrere Zeichen aufnehmen, was ja eigentlich einem char-Array entspricht.
'\n' ist NEWLINE, nicht NULL ('\0'). Ein String muß immer mit einem NULL-Byte (bzw. char) abgeschlossen werden, sonst wird er von den Bibliotheksfunktionen nicht richtig behandelt.