Hallo mazell
Ignorieren wir mal die letzten Beiträge, die sich nicht mit Deinem Problem beschäftigen.
Die Aussage, daß mein Vorschlag nicht das gelbe vom Ei ist, kann ich annehmen und bestätigen. Mir ging es mal darum das Problem einzugrenzen und eine Diagnose zu machen. Da es jetzt funktioniert heißt, daß wir der Lösung näher gekommen sind, weil wir wissen, was daran schuld ist.
Eine Saubere Programmierung kommt jetzt.
Zuerst zu Deinen Frage:
warum ich hinterher nicht mehr auf das array zugreifen kann (Außerhalb der while schleife)
Du hast das Array "char data[80];" innerhalb der Funktion definiert, darum existiert es nur innerhalb dieser Funktion. Wenn Du das Array am Anfang, außerhalb aller Funktionen ( inbegriffen setup() und loop() ) definierst, dann ist die Variable eine globale Variable und in allen Funktionen existent und Du kannst innerhalb aller Funktionen darauf arbeiten. Das ist eine Eigenschaft von C.
Kleinen Zusatzinfo.
Um Daten an eine Funktion zu übergeben bzw von ihr zurückliefern zu lassen gibt es mehrere Möglichkeiten.
- globale Variablen
- in der Funktion übergebene Werte zb "Serial.print (100,DEC)" . Du übergibst 2 Werte, "100" und "DEC". Es können mehrere Werte übergeben werden.
- Die Funktion kann 1 in Worten EINEN Wert zurückgeben. Das macht man innerhalb der Funktion mit return(Wert); zb "zufallszahl = random(maxwert);" Die Funktion gibt eine Zufallszahl zurück, die zwischen 0 und dem Maximalwert maxwert liegt.
- Der Funktion werden Zeiger übergeben und sie speichert die Daten in den Variablen ab auf die die Zeiger zeigen. Dadurch kann man mehr als einen Rückgabewert haben. Man muß sich etwas in die Zeiger (pointer) einarbeiten und diese verstehen, um sie benutzen zu können.
- man benutzt externen Speicher (EEPROM, FRAM, SD-Speicherkarte) um Daten zwischenzuspeichern. Man muß sich aber sowas wie eine Speicherverwaltung ausdenken um zu wisse, wo, was ist und wo freier Speicher ist.
Zurück zu Deiner Seriellen Schnittstelle.
Damit Du alles einlesen kannst mußt Du die Funktion regelmäßig aufrufen. Am einfachsten machst Du das in der loop-Funktion. Brauchst Du eine eigene Funktion zum Einlesen der seriellen Schnittstelle?
char Data[8];
int i;
unsigned long Zeit;
...
loop(){
...
if (Serial.available()){
do {
if (Serial.available()) {
Data[i] = Serial.read();
i++;
}
if(i<1)Zeit = millis();
} while (i<7&&(millis()-Zeit) < 500);
}
...
}
Der Kode kontrolliert ob ein Zeichen auf der seriellen Schnittstelle verfügbar ist. Wenn ja liest er 7 Zeichen ein (die Anzahl kannst Du in der "while"-Zeile ändern), oder wartet 500 m-Sekunden ob Daten kommen (die Wartezeit kannst Du auch in der "while"-Zeile ändern). Wenn jedesmal eine konstante Anzahl von Zeichen übertragen werden sollen, kannst Du die Zeitkontrolle auch löschen. Die Zeitkontrolle ist sinnvoll da so eine Variable Anzahl von Zeichen übertragen werden können. zB Du kannst 12; 100 und 1200 übertragen und mußt nicht 0012; 0100 und 1200 schreiben.
zu do.. while: ist ähnlich dem while, nur wird die Schleife mindestens 1-mal durchlaufen wird, weil die Aussprung-Kontrolle am Ende gemacht wird.
http://arduino.cc/en/Reference/DoWhile Viele Grüße Uwe
Grüße Uwe