Hallo Gemeinde,
ich sende 4 Messwerte über die serielle Schnittstelle von einem Nano zu einem Mega.
Die einzelnen Werte sind durch '\t' getrennt. Einzeln funktioniert das prima.
Nun wollte ich das mittels einer Schleife realisieren.
void loop() {
while (Serial3.available() > 0) {
int inChar = Serial3.read();
for (int j = 0; j < 4 ; j++) {
inString[index] = inChar;
if (index < 10) index++;
if (inChar = '\t'){
Serial.print(inString);
index = 0;}
}
}
}
Die Ausgaben im ser. Monitor liefern leider nur Müll.
Was ist daran falsch?
Gruß und Dank
Hannes
Hallo,
warum immer nur alles in String- wenn es Zahlen/Ziffern sind?!
hier unter #11
steht geschrieben wie man es machen kann.
Gruß und Spaß
Andreas
Hallo Andreas,
leider beantwortet das meine Frage nicht. Ich möchte verstehen was an dem Code.Schnipsel falsch ist.
Gruß
Hannes
Du solltest den kompletten Sketch zeigen. Wie ist inString definiert?
Dann solltest Du erst mal jedes empfange Zeichen einzeln auf Serial ausgeben, um zu sehen, ob überhaupt das ankommt, wass Du vermutest.
Mehr kann man zu dem Fragment nicht sagen.
Gruß Tommy
Hallo Hannes,
"leider beantwortet das meine Frage nicht"
Ja, ja, ist nicht so einfach es Dir recht zu machen.
Ich habe in letzter Zeit ne´ Menge serielleArduinoKommunikation geübt und gelernt.
Was mir sehr geholfen hat, ist ein TerminalProgramm, das RAW-Daten ausgibt.
Da kannst Du sehr schön sehen, was denn tatsächlich gesendet wird- und dieses wunderbar mit
dem Arduino vergleichen. Das hat mir oft ziemlich auf die Sprünge geholfen.
Beantwortet Deine Frage aber auch nicht, wie Tommy56 schon sagte...
Gruß und Spaß
Andreas
Hi Tommy,
#define PUFFERLAENGE 10
#define anz 4 // Anzahl der zu empfangenden Messwerte
char inString[PUFFERLAENGE];
int index;
Der Sender:
// Sender
#define Anz 4 // Anzahl der zu sendenden Daten
#include <SoftwareSerial.h>
SoftwareSerial TELSerial(10, 11); // RX, TX Telemetrie
int pruefsumme;
float Daten[Anz];
byte Status = 1;
union data_u {
struct {
int wert[Anz];
};
byte bytes[10];
};
data_u data;
void setup() {
Serial.begin(9600);
TELSerial.begin(9600);
data.wert[0] = 22;
Serial.println(data.wert[0]);
}
void loop() {
delay(1000);
//******************Messwerte*********************************
Daten[0] = 1; // Testwerte
Daten[1] = 2;
Daten[2] = 3;
Daten[3] = 4;
pruefsumme = 0;
//*********************Seriell schreiben**********************
for (int j = 0; j < Anz ; j++) {
data.wert[j] = int ((Daten[j] * 10) + .5) ;
Serial.print(data.wert[j]);
Serial.print('\t');
TELSerial.print(data.wert[j]);
TELSerial.print('\t');
pruefsumme += data.bytes[j * 2];
pruefsumme += data.bytes[j * 2 + 1];
}
Serial.print("\tPruefsumme: ");
Serial.println(pruefsumme);
TELSerial.println(pruefsumme);
}
Das mit den Prüfsummen wird dann erst später ausgewertet.
Danke!
Hannes
Ist zwar allgemein schlecht angesetzt..
if (inChar = '\t') vergleicht man nicht mit == anstatt = ??
velleicht so, :
[code]
void loop() {
while (Serial3.available() > 0) {
int inChar = Serial3.read();
inString[index] = inChar;
if (index < 10) index++;
if (inChar == '\t'){
Serial.print(inString);
index = 0;}
}
}
}
[/code]
Hallo Andreas,
Ja, ja, ist nicht so einfach es Dir recht zu machen.
Was soll das denn? Ich habe, hoffentlich höflich genug, eine Frage gestellt. Als Anfänger gibt es davon leider reichlich. Ich denke auch Du wirst einmal angefangen haben.
Hannes
Hallo,
ich habe ein gesetzt. Kannst Du jetzt besser schlafen?
Gruß und Dank
Andreas
Hi Andreas,
ich habe ein gesetzt. Kannst Du jetzt besser schlafen?
Danke für die zusätzliche Mühe.
Deine Beiträge beeinflussen mein Privatleben wirklich nicht.
Es würde, sicher nicht nur, mich freuen wenn wir das mal beenden würden.
Hannes
Hallo "Schuppeste",
das "==" bringt leider keinen Erfolg.
Danke für Deine Mühe.
Hannes
Hallo,
das ist es, was ich meine… Rate mal mit Rosenthal…
Mit dem sendest Du doch zum Empfänger?
TELSerial.print(data.wert[j]);
TELSerial.print('\t');
TELSerial.println(pruefsumme);
und mit dem
void loop() {
while (Serial3.available() > 0) {
int inChar = Serial3.read();
for (int j = 0; j < 4 ; j++) {
inString[index] = inChar;
if (index < 10) index++;
if (inChar = '\t'){
Serial.print(inString);
index = 0;}
}
}
}
willst Du empfangen…
Was- sendest Du? z.B. 4711 oder "47.11" oder "Dampf"
Und was empfängst Du? Hast Du das einmal geprüft? Was kommt bei Dir an?
Wenn Du Probleme mit der serielle Übertragung hast, dann muß-
detalliert feststehen, was gesendet wird.
Also komme hier einmal mit einigen Informationen rüber.
"ich sende "47.11" als float. Da mache ich einen String draus.
Dann erstelle ich eine Prüfsumme, diese hat den Wert 13.
Bei mir kommt aber nur "11.47" an und die Prüfsumme hat den Wert 58
So, in der Art…
Gruß und Spaß
Andreas
Den Vergleich mit == anstelle von = hat Dir Schuppeste schon geschrieben.
Was zur Ausgabe noch fehlt, ist der Abschluss der Zeichenkette mit '\0', damit sie mit Serial ausgegeben werden kann.
void loop() {
while (Serial3.available() > 0) {
int inChar = Serial3.read();
inString[index] = inChar;
if (index < 10) index++;
if (inChar == '\t'){
inString[index] = '\0';
Serial.print(inString);
index = 0;}
}
}
}
Mehr Infos dazu gibt es in Zeichenketten in C.
Gruß Tommy
Was ich sende steht doch in dem Beispiel.
Ich verstehe daher Deine Frage (einmal mehr) nicht.
Nochmal: Ich sende 4 Messwerte, getrennt durch '\t', und möchte diese, in einer Schleife, wieder lesen.
Das Prüfsummengedöns hat doch, bis dahin, noch nix mit meinem Problem zu tun.
Hannes
Hi Tommy,
vielen Dank. Das löst schonmal ein Problem.
Aber: Ich sende (z.B.) 10 20 30 40 bekomme aber im ser. Monitor des Empfängers:
11110000 22220000 33330000 44440000
Da ist noch irgendwo "der Wurm drin".
Gruß
Hannes
Hallo,
hier bin ich mir nicht sicher
Serial.print('\t');
das ist doch gesendetes ASCII, 92 und 116
muß das nicht
Serial.write('\t');
sein?
Gruß und Spaß
Andreas
Ich würde an deiner Stelle den Empfang der Zeile von der Analyse der Zeile trennen.
Das macht beide Routinen einfacher und es gibt keine Notwendigkeit für whiles mehr.
Man sollte blockierende Routinen meiden, nicht neue konstruieren.
Danke!
Hab jetzt Alles rausgelöscht was die Analyse angeht.
Sender:
// Sender
#define Anz 4 // Anzahl der zu sendenden Daten
#include <SoftwareSerial.h>
SoftwareSerial TELSerial(10, 11); // RX, TX Telemetrie
int pruefsumme;
float Daten[Anz];
byte Status = 1;
union data_u {
struct {
int wert[Anz];
};
byte bytes[10];
};
data_u data;
void setup() {
Serial.begin(9600);
TELSerial.begin(9600);
data.wert[0] = 22;
Serial.println(data.wert[0]);
}
void loop() {
delay(1000);
//******************Messwerte*********************************
Daten[0] = 1; // Testwerte
Daten[1] = 2;
Daten[2] = 3;
Daten[3] = 4;
pruefsumme = 0;
//*********************Seriell schreiben**********************
for (int j = 0; j < Anz ; j++) {
data.wert[j] = int ((Daten[j] * 10) + .5) ;
Serial.print(data.wert[j]);
Serial.print('\t');
TELSerial.print(data.wert[j]);
TELSerial.print('\t');
}
Serial.println(" ");
TELSerial.println(" ");
}
Empfänger:
// Empfänger
#define PUFFERLAENGE 10
#define anz 4 // Anzahl der zu empfangenden Messwerte
char inString[PUFFERLAENGE];
int index;
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
Serial3.begin(9600);
}
void loop() {
while (Serial3.available() > 0) {
int inChar = Serial3.read();
for (int j = 0; j < anz ; j++) {
inString[index] = inChar;
if (index < 10) index++;
if (inChar == '\t'){
inString[index] = '\0';
Serial.print(inString);
index = 0;}
}
}
}
Ich sende : 10 20 30 40 und empfange (lt. ser. Mon.): 11110000 22220000 33330000 44440000
Gruß
Hannes
Wozu willst du den zweiten int Array einsetzen?
Warum druckst du die Werte nicht einfach?
//*********************Seriell schreiben**********************
for (int j = 0; j < Anz ; j++) {
int value = (int) (Daten[j] * 10 + .5);
Serial.print(value);
TELSerial.print(value);
if (j != Anz - 1) {
Serial.write('\t');
TELSerial.write('\t');
}
}
Serial.println();
TELSerial.println();
}
Hannes54:
Hab jetzt Alles rausgelöscht was die Analyse angeht.
Empfänger:
while (Serial3.available() > 0) {
int inChar = Serial3.read();
for (int j = 0; j < anz ; j++) {
inString[index] = inChar;
if (index < 10) index++;
if (inChar == '\t'){
inString[index] = '\0';
Serial.print(inString);
index = 0;}
}
}
Das Gefummel mit den Tabs ist dann bitte was?
Und was soll das for an der Stelle?
Was hat das mit dem Empfang einer Zeile (unbekannten Inhalts) zu tun?
Und überlasse loop die Iteration, mach aus dem while ein if.
Ist einfacher, kürzer und gibt dem Rest des Programms mehr Luft.
Ich habe n x Messwerte ( float) die ich übertragen muss.
Deshalb mache ich daraus (x10) int . Auf der Empfangsseite wird ein "," eingefügt.
Eine Kommastelle reicht aus.
Der Hintergrund des Ganzen:
Ich habe einen Code, dankenswerter Weise von "Agmue", bekommen der genau mein Vorhaben umsetzt.
Es werden die Messwerte richtig übertragen und das mit den Prüfsummen funktioniert auch perfekt.
Nun wollte ich, zur Synchronisation, noch ein "Startzeichen" (z.B.">") mit einbauen und noch ein Statusbyte übertragen. Ich bastel da schon lange dran herum und (außer Frust) kommt da nix Gescheites bei raus. Je mehr ich im WWW suche um so weniger scheine ich zu verstehen....
Viele Programmieraufgaben konnte ich schon lösen aber diese serielle Übertragung schafft mich noch irgendwann.
Auch das "Kochbuch" was ich mittlerweile hier habe hilft mir nicht weiter.
Da ich ähnliche Fragen schon in meinem anderen Thread (Dampfschiff) gestellt habe hoffe ich sehr kein Crossposting gemacht zu haben.
Gruß
Hannes