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