Daten in Buffer Speichern

Gast #930146
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();

      ....
    }
  }
}
Gast
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
Persönliche Seite
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.
Gast
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.