www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Daten in Buffer Speichern


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich habe ein kleines Problem, ich möchte die Daten, die von der serielle 
Schnittstelle ankommen, bearbeiten. Die Daten empfange ich ohne Problem 
aber wenn ich die empfangene Daten in einem zweidimensional Array 
speichern will,ist die Varialble Buffer immer leer, aber die Variable 
receivedString enthält immer die richige Werte. Weiss jemanden warum?

Danke

int main()
{
  char string[100];
  char receivedString[100];
  char Buffer[10][100];
  nextCharPos = 0;
  stringReady = 0;

  sei();

  while( 1 ) {

    if( stringReady == 1 ) {  // von der ISR wurde ein String komplett
                              // empfangen
      cli();
      strcpy( receivedString, string );
      printf("value:%s\n",receivedString);
      strcpy( Buffer[0], string );
      printf("value:%s\n",Buffer[0]);
      stringReady = 0;
      sei();

      ....
    }
  }
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin mir jetzt nicht 100% sicher aber ich denke es fehlt ein &

strcpy( Buffer[0], string ); -> strcpy( &Buffer[0], string );

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
es klappt leider nicht, das Buffer ist immer leer

Autor: nixversteh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hätte noch den hier:
&Buffer[0][0]

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enthält denn receivedString überhaupt einen String, d.h. mit 0 
abgeschlossen, aber keine 0 mittendrinn?


Peter

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe es gerade unter MSVS2008 getestet, so geht das kopieren 
zumindest

[p]
 strcpy( string, "abcde" );

 strcpy( receivedString, string );
 printf("value:%s\n",receivedString);
 strcpy( Buffer[0], string );
 printf("value:%s\n",Buffer[0]);
 stringReady = 0;
[/p]

der Fehler ist also vermutlich woanders zu suchen

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   char Buffer[10][100];

Frisst 1000 fette Bytes vom Stack, d.h. vom RAM. Wie gross ist das RAM 
von deinem Target-µC eigentlich?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Das RAM ist 4KBytes groß.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem dürfte darin liegen, daß der von der ISR benutzte 
Empfangspuffer "string" hier vermutlich doppelt deklariert ist, nämlich 
nochmal als automatische (auf dem Stack liegende) Variable innerhalb von 
main(). Damit verdeckt diese automatische Variable die irgendwo anders 
deklarierte Variable, die von der ISR befüllt wird, und sämtliche 
Zugriffe aus main() heraus schlagen fehl.

Abhilfe:
string als globale Variable außerhalb von main() deklarieren. Und am 
besten auch noch als volatile.
stringReady muss übrigens auch als volatile deklariert werden.

Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rufus,

ich habe das Programm korrigiert,das war nur ein Teil des Programms, das 
ich geschrieben habe.Ich habe die Variable tempstr früher so deklariert: 
im main char tempstr[255]; und im receiver.c extern char tempstr[];.Jetz 
habe ich tempstr genauso wie im main.c deklariert.Ich weiss,dass nicht 
richtig ist aber kann ich schon der Inhalt von buffer lesen. Falls ich 
die Variable in header file definiert und als extern in der main 
Funktion benuzten will, kriege ich einen Fehler, wenn ich die Variable 
in der main mit memset entleeren will.
Jetz habe ich noch ein anderes Problem, wenn ich zwei String(maximal 
Länge von 13 Bytes) nacheinander(Wartezeit=2.7ms) sende, bekomme ich in 
der sprintf-Funktion nur ein Teil des zweiten Strings. Das verstehe ich 
nicht, weil ich in der main Fuktion gehe, falls ein vollständiger String 
in der ISR empfangen wurde.
Bitte kannst du mir erklären, wie es funktionniert muss.

ich danke dir

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.