Go Down

Topic: Mehrere Variablen an Arduino schicken (Read 4542 times) previous topic - next topic

mazell

Danke für die Antworten,

ich habe das so versucht:

Code: [Select]

void get_data() {
  char data[80];
  int incount = 0;
  if ( Serial.available() )
  {
    while (Serial.available()) {
    data[incount++] = Serial.read();     
    }
    //data[incount] = '\0';  // puts an end on the string
    Serial.println(data);
}
}


So, das Problem sieht so aus:

Ich schicke seriell: 12345678

Als Antwort bekomme ich:
1
2
3
45

warum?
wenn ich jetzt noch mal was sende z.B. 9999
bekomme ich

678 zurück.


Serial.print.data[0] liefert auch keine ergebnisse, warum ?

Danke

funkheld

#16
Feb 16, 2011, 10:47 pm Last Edit: Feb 16, 2011, 10:49 pm by funkheld Reason: 1
irgendwie verstehst du das mit dem seriellen ablauf nicht.
wenn ich sichere daten empfangen möchte in "c" dann muss auch eine abstimmung stattfinden zwischen versender und verschicker sonst hast du nur den gurkensalt wie jetzt auch.
was meinst du wohl warum eine serielle schnittstelle 9 pins hat?....he...

jetzt lese dir das mal ganz durch mit dem uart..., da steht auch etwas vom empfang von zeichenketten...:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

uwefed

Hallo mazell
Du scheinst den Eingangsbuffer schneller zu leeren als Daten kommen.
Versuch mal:
eine schneller Baudrate einzustellen
oder ein delay (5) in die while Schleife zu geben.
Das "Serial.println(data);" muß nach dem "data[incount++] = Serial.read();  " stehen da Du ansonsten einige Zeichen nicht ausdrucken könntest.
Des weiteren sehe ich daß der Empfang nicht im Loop steht sondern in einer anderen Funktion. Slbald der Eingangsbuffer leer ist springst Du aus dieser Funktion und mußt sie für den Empfang der weiteren date wieder aufrufen.
Grüße Uwe

   

mazell


Hallo mazell
Du scheinst den Eingangsbuffer schneller zu leeren als Daten kommen.
Versuch mal:
eine schneller Baudrate einzustellen
oder ein delay (5) in die while Schleife zu geben.
Das "Serial.println(data);" muß nach dem "data[incount++] = Serial.read();  " stehen da Du ansonsten einige Zeichen nicht ausdrucken könntest.
Des weiteren sehe ich daß der Empfang nicht im Loop steht sondern in einer anderen Funktion. Slbald der Eingangsbuffer leer ist springst Du aus dieser Funktion und mußt sie für den Empfang der weiteren date wieder aufrufen.
Grüße Uwe   

Danke Uwe, jetzt funktioniert es :) Mir stellt sich nur die Frage, warum ich hinterher nicht mehr auf das array zugreifen kann (Außerhalb der while schleife) =? Die Ausgabe stimmt jetzt.
Wenn ich jetzt folgenden Code ausführe, passiert nichts:
Code: [Select]

Serial.println(data[0]);
Serial.println(data[1]);
Serial.println(data[2]);

Die Ausgabe bleibt leer hmm

funkheld

#19
Feb 17, 2011, 11:31 am Last Edit: Feb 17, 2011, 12:18 pm by funkheld Reason: 1
ihr lasst die wesentlichen grundzüge der uart-programmiererung ausser acht.
sender und empfänger müssen sich immer verständigen wann daten losgeschickt werden und ankommen.

eine delay in der schleife ist unsinn, bremst nur den gesamten ablauf ab und nicht nur die uart-spielerei.

die zeit zum lesen der richtigen uart-handhabung sollte man schon haben, bevor man gross in die tasten haut und dem zufall der delay-bremse überlässt.

mit dem hammer kann man das ziel schlecht erreichen.

gruss

stundenblume

@funkheld
Hast Du auch konstruktive Vorschläge oder weiterführende Infos?
Libraries:
  - multiCameraIrControl [V1.6]
  -

funkheld

#21
Feb 17, 2011, 12:06 pm Last Edit: Feb 17, 2011, 12:12 pm by funkheld Reason: 1
manomoter..., hier habe ich den hinweiss gegeben:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

darin gibt es mehrere sichere möglichkeiten die er auswählen kann für sein projekt.
alle dort sind gut beschrieben.
das soll doch nicht so schwer sein..... :D :D :D

das ist der  atmega328p zum programmieren, mit  dem winavr-c und da gibt es auch eine schöne ecke die ich gefunden habe für mich :
http://www.mikrocontroller.net/     8)

abteilung > gcc und codesammlung mit sehr vielen hilfsbeispielen.

gruss

stundenblume

Geht doch, mich interessiert es nicht. Aber wenn man schon pöbelt, dann wenigstens einen Vorschlag machen. Das Internet bietet doch so schöne Möglichkeiten auf etwas zu verweisen. :D

Sebastian
Libraries:
  - multiCameraIrControl [V1.6]
  -

funkheld

#23
Feb 17, 2011, 12:15 pm Last Edit: Feb 17, 2011, 12:16 pm by funkheld Reason: 1
Quote

Geht doch, mich interessiert es nicht.


und warum schreibst dann so einen geistigen dünnschiss(siehe quote)...., dann verkrümel dich hier.
du gehörst in den kindergarten > abteilung 5 jährige. so kannst du die leute hier nicht verscheissern: geht doch usw...., ist eine billige zusage.

kopfschüttel.... 8) 8) 8)

gruss




Webmeister

Ich glaube zwar nicht dass die von funkheld erwähnten Links dem Threadersteller mazell helfen werden.
Die Thematik geht vermutlich zu tief ins Eingemachte.  :( (auch wenn sie von funkheld gut gemeint sind)

funkheld

#25
Feb 17, 2011, 12:20 pm Last Edit: Feb 17, 2011, 12:28 pm by funkheld Reason: 1
Quote

...mazell helfen werden.

wenn er lesen kann ist er klar im vorteil.

man, das ist so gut beschrieben, die leute haben sich dort die mühe gemacht etwas für anfänger zu schreiben und die mühe hat sich gelohnt. wer diese beispiele mal durchübt kommt zum ziel mit der uart.

einfacher geht es nicht mehr zu beschreiben.

viele sind sich garnicht im klaren, wenn vom uno geredet wird, das es ein 328p ist und das ist ein guter micro.
der begriff "arduino" wird immer als kindergartenmicro angeboten, das es aber "c" ist begreifen die wenigsten.
und das er auch seine tücken hat mit den fertigen tools , kommt noch dazu.


gruss

Webmeister

@funkheld

Schade dass deine Aussagen immer wieder für Unruhe sorgen. Wir wollen hier doch anständig miteinander umgehen.
Bitte halte dich auch an diese Regeln.

Leider verstehen viele Forumteilnehmer deine Aussagen und Kommentar oft nicht wirklich. Ich werde teilweise auch nicht schlau aus deinen Bemerkungen.  ;)

Erinnere dich doch dass wir hier im Arduino-Forum sind und viele Benutzer sind Einsteiger und Hobbisten. Dieses Zielpublikum erstellt die Arduino-Anwendungen mit der Standard-Umgebung und will und kann sich nicht mit der Tiefe der Materie, in der du dich scheinbar befindest, auseinandersetzen. Darum bringen viele Hinweise und Verlinkungen in AVR-Foren und Tutorials meist nicht viel. Auch wenn du der Ansicht bist, dass diese Informationen von jedem Einsteiger verstanden werden.

stundenblume

Quote
und warum schreibst dann so einen geistigen dünnschiss(siehe quote)...., dann verkrümel dich hier.
du gehörst in den kindergarten > abteilung 5 jährige. so kannst du die leute hier nicht verscheissern: geht doch usw...., ist eine billige zusage.

kopfschüttel.... smiley-cool smiley-cool smiley-cool

Weil es nicht um mich, sondern um die Leute geht die dieses Thema lesen. Es ist einfach deutlich flüssiger zu lernen wenn man nicht nur unverständliche Aussagen erhält, sondern gleich auch relevante Quellen, wenigstens hilfreiche Tips.
Libraries:
  - multiCameraIrControl [V1.6]
  -

Webmeister

Quote
viele sind sich garnicht im klaren, wenn vom uno geredet wird, das es ein 328p ist und das ist ein guter micro.

Das ist ja gerade der Vorteil an Arduino. Man muss nicht ein Microcontroller-Crack sein und kann trotzdem sinnvolle und spannende Anwendungen realisieren. Bei den ersten Schritten ist es auch nicht wichtig ob man einen 168 oder 328 oder was auch immer nutzt (ausser man kommt an die Grenzen des verwendeten Controllers  ;))
Sobald man die ersten Schritte gemacht und etwas Erfahrungen gesammelt hat, wird man merken dass man sich die Elektronik auch selbst aufbauen kann und dass man auf verschiedene Wege Programme in den Microcontroller laden kann.

Wie bereits gesagt, sind hier viele Einsteiger und die haben nicht alle jahrelange Erfahrung in der Entwicklung und Programmierung von Microcontroller-Lösungen. Diese Tatsache sollte man sich immer im Hinterkopf behalten.  ;)

@funkheld
Damit deine Aussagen auch wirklich gut ankommen, bitte Satzzeichen und Gross/Kleinschreibung nutzen. Danke.

uwefed

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:
Quote
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?
Code: [Select]

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   

Go Up