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(); .... } } }
bin mir jetzt nicht 100% sicher aber ich denke es fehlt ein & strcpy( Buffer[0], string ); -> strcpy( &Buffer[0], string );
Enthält denn receivedString überhaupt einen String, d.h. mit 0 abgeschlossen, aber keine 0 mittendrinn? Peter
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
> char Buffer[10][100];
Frisst 1000 fette Bytes vom Stack, d.h. vom RAM. Wie gross ist das RAM
von deinem Target-µC eigentlich?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.