Hallo Leute,
stehe vor einem Logik Problem...
Hoffe es kann jemand helfen 
Habe 2 Arduino Mega über Serial Verbunden, also Rx auf Tx und Tx auf Rx
Kann auch schon erfolgreich Daten verschicken und diese kommen auch erfolgreich an.
Die Daten werden momentan erst geschickt, wenn ein Taster betätigt wird.
Also Taster wird betätigt, dann wird "12345" über Serial.write zum anderen Arduino geschickt.
Alles super.
Nur folgendes Problem... würde gerne zu Testzwecken den Taster rausnehmen und einen Code schreiben der automatisch alle 2 Sekunden Wert A "12345" über serial.write schickt, 2 Sekunden später Wert B "67890" über Serial.write schickt. Das in Endlosschleife.
Egal was ich versuche, bringe so einen Code einfach nicht zusammen.
Wäre erfreut wenn jemand von den Experten mir Helfen könnte mit dem Code 
Bin noch ein "Neuling" mir fehlt noch die Erfahrung
DANKE LEUTE !!! 
Hi,
poste doch einfach mal das was du bisher versucht hast. Bitte in Code-Tags einfügen.
Bitte....aber wofür ?
Wir haben doch nichts gemacht und nichts machen können.
Es fehlt einfach dein Sketch.
Setze den bitte in Code-Tags.
Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.
Damit wird dieser für alle besser lesbar, auch mobile Geräte.
HIER DER SENDER
//#include <SoftwareSerial.h>
//#define Taster 7
char data[5] = "12345";
char newdata[5] = "67890";
long timee = 0;
long aktuelletime = 0;
long newtime= 0;
void setup() {
//pinMode(Taster, INPUT);
Serial.begin(9600);
}
void loop() {
timee = millis();
if (timee >= 2000) { Serial.write(data); timee = newtime;Serial.println(data); };
// if (digitalRead(Taster) == LOW) {
if (newtime >= 2000){Serial.write(newdata); newtime = aktuelletime;Serial.println(newdata); }
aktuelletime = timee;
//Write the serial data
//}
}
UND DER EMPFÄNGER
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 21, /* data=*/ 20, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather M0 Basic Proto + FeatherWing OLED
//############## SERIAL BELOW ################
char data[5] ;
void setup() {
u8g2.begin();
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
Serial.readBytes(data, 5); //Read the serial data and store in var
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.drawStr(0,10,data);
//Serial.println(data); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
delay(10);
// Serial.print(data);
}
}
Am Empfänger hängt noch ein Display, der mir das dann Ausgibt...
Danke im Voraus schon mal
Erster Punkt, du solltest auf dem Mega nicht Serial verwenden, sondern Serial1.
Serial wird auch vom USB-Adapter verwendet.
Den Rest kannst du ja erst mal mit delay(2000) (keine optimale Lösung) erschlagen.
Also Pseudocode:
1. Aussendung
delay(2000);
2. Aussendung
delay(2000);
Wenn das funktioniert die delays rausoptimieren.
Hatte ich schon probiert, jedoch passiert dann im Seriellen Monitor folgendes:
Es wird 12345 ausgegeben, dann nach 2 sek 6789012345
dann wieder 12345 dann wieder 6789012345 usw
Nach deinem Pseudocode sollte er eigentlich 12345 senden, dann nach 2 Sekunden erst 67890 und dann nach 2 Sekunden wieder 12345.
Das ist der Punkt an dem ich scheitere und keine Lösung weiß
Gruß
Hallo,
vermutlich hattes Du das zweite delay() nicht mit dringehabt.
ich würde am ende der Zeile ein endzeichen mit versenden z.B ein "\n" oder mir Seriell.println() versenden. Dann kannst Du beim Einlesen bis zu dem Enzeichen einlesen und weisst wann ein Sendevorgang beendet ist.
Heinz
Kommunikation zwischen 2 Arduinos, oder mit einem PC?
Nicht in der Lage einen eigenen Parser zu schreiben?
Dann, versuchs mal mit dem CmdMessenger !
char data[5] = "12345";
char newdata[5] = "67890";
Das sind 6 Zeichen. Du vergisst den Null-Terminator. Am besten lasse die Größenangabe weg. Der Compiler macht das für dich
Beim Empfang musst du den String auch terminieren. Da musst du dann 6 als Größe angeben
Wie gesagt musst du irgendwie das Ende erkennen. Mit einem Linefeed kann man dann readBytesUntil() verwenden. readBytes() hat lediglich eine Timeout Zeit was sehr schlecht ist