Forum: Mikrocontroller und Digitale Elektronik Daten in Buffer Speichern


von gast (Gast)


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();

      ....
    }
  }
}

von Peter (Gast)


Lesenswert?

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

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

von gast (Gast)


Lesenswert?

hallo,
es klappt leider nicht, das Buffer ist immer leer

von nixversteh (Gast)


Lesenswert?

Ich hätte noch den hier:
1
&Buffer[0][0]

von Peter D. (peda)


Lesenswert?

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


Peter

von Peter (Gast)


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

von Stefan B. (stefan) Benutzerseite


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?

von gast (Gast)


Lesenswert?

Hi,
Das RAM ist 4KBytes groß.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von gast (Gast)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.