Daten in Buffer Speichern

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

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren