Moin Moin, ich bin gerade dabei einige Messwerte vom ATmega168 über RS232 an meinen PC zu senden. Hierfür benutze ich die UART Lib von Peter Fleury. Funktioniert alles gut soweit. Nun möchte ich aber die Werte in ein Array schreiben und leider treten dabei einige Probleme auf. Als Variablen habe ich folgende definiert: int j,k = 0; uint16_t DataVectorY[30][28]; char DataBuffer[3]; In meinem Programm wird nun das Array mit Zahlen mit einem maximalen Wert von 840 gefüllt. Anschließend sollen diese über RS232 versendet werden. for (j=0, j<30, j++) { for (k=0, k<30, k++) { utoa(DataVectorY[j][k], DataBuffer, 10); uart_puts(DataBuffer); _delay_ms(50); } } Teilweise kommen die Daten an, teilweise aber totales Chaos. Muss ich was bei der Konvertierung beachten? Danke, Basti
Hallo uint16_t DataVectorY[30][28]; ^^ ^^ for (j=0, j<30, j++) { ^^ for (k=0, k<30, k++) ^^ Da stimmt doch was mit den Bereichen nicht! Gruß Joachim
> for (k=0, k<30, k++) {
du hast aber nur 28 elemente!
> uint16_t DataVectorY[30][28]; ^^^^^^^^ ^^ ^^ ..schon mal ausgerechnet wie viel RAM das braucht? ..und mit den Angaben im Datenplatt verglichen? Abgesehen davon.. > for (j=0, j<30, j++) ..hat der Kommaoperator hier nix verloren. HTH
> char DataBuffer[3]; > > In meinem Programm wird nun das Array mit Zahlen mit einem maximalen > Wert von 840 gefüllt. > utoa(DataVectorY[j][k], DataBuffer, 10); Dann ist auch der DataBuffer zu klein. Um einen String der Länge 3 speichern zu können, muss das Array 4 Elemente groß sein. Denn das für Strings obligate \0 Byte muss ja auch irgendwo hin. Könnte aber auch der Klassiker sein. In C bezeichnet die Angabe in der Definition char Irgendwas[ Zahl ] also die Zahl, nicht den höchsten Index, sondern die Anzahl an Elementen. Ein Array int a[4]; hat also 4 Elemente. Ihre Indizes sind: a[0] a[1] a[2] a[3] Zähl nach. Sind genau 4 Stück. Das heisst aber auch, der höchste zulässige Index in das Array ist genau um 1 kleiner als die Längenangabe.
Danke euch. Es lag an meiner for-Schleife. Bin dennoch etwas stutzig, da ich 2 Arrays benutze und es keine Probleme mit dem Speicher gibt. uint16_t DataVectorY[30][28]; uint16_t DataVectorX[30][20]; Das sind doch 30*28=840 Werte á 2 Byte für die y-Werte -> 1680 Byte. Und 30*20=600 Werte á 2 Byte für die x-Warte -> 1200 Byte. Im Datenblatt steht für den RAM aber 1KByte. Wie wird das organisiert, bzw. warum führt das nicht zu Problemen? Danke bisher und viele Grüüße Basti
Basti schrieb: > Danke euch. Es lag an meiner for-Schleife. Bin dennoch etwas stutzig, da > ich 2 Arrays benutze und es keine Probleme mit dem Speicher gibt. Nur weil du bis jetzt keine Probleme beobachtet hast, heißt das nicht, das es keine gibt oder geben wird. Wie heißt es so schön: Durch Testen kann man immer nur die Anwesenheit von Fehlern nachweisen, nicht aber das Fehlen derselben. Die Hoffnung ist halt, wenn man lang genug testet und keinen Fehler sieht, dass man dann auch wahrscheinlich keine mehr hat. Aber Hoffnungen können trügerisch sein. Es könnte auch sein, dass man genau den entscheidenden Test, der den Fehler gezeigt hätte, nicht gemacht hat. Das Blöde drann ist, das man das eben nicht weiß, welches der relevante Test ist, ohne den Fehler bereits zu kennen. TV-Kaiser: Ein Teufelskreis! Daher: Bei der Fehlersuche schlägt Wissen und Können alle anderen Techniken. Fehler die man gleich gar nicht erst macht, muss man auch nicht suchen.
Basti schrieb: > Im Datenblatt steht für den RAM aber 1KByte. Wie wird das organisiert, > bzw. warum führt das nicht zu Problemen? du merkst es nur nicht, wenn du mal an jede Stelle vom Array einen anderen Wert schreibst wirst du vermutlich feststellen das sich das array überlappt.
Ok, danke bis hierher. Dann "hoffe" ich mal, dass es erstma problemfrei bleibt :)
Basti schrieb: > Dann "hoffe" ich mal, dass es erstma problemfrei > bleibt :) kann es gar nicht, mache den Test und schreib etwas in das array rein: for (j=0, j<30, j++) { for (k=0; k<28; k++) { DataVectorX[j][k] = 10000 + j*100 + k; DataVectorY[j][k] = 20000 + j*100 + k; } } dann versendest du es und schaust was drin steht.
Ich mache es jetzt auch ohne die for Schleife. Ich versende jeden Datenwert direkt nachdem ich ihn aufgenommen habe. Bedingt durch meine Struktur im Programm. Jedoch fülle ich den Array mit Werten von 0-27 (y-Werte) und 0-19 (x-Werte) immer abwechselnd. DataVectorY[0][0] = 0; //Danach versand über RS232 DataVectorY[0][1] = 1; //Danach versand über RS232 . . . DataVectorY[0][29] = 29; //Danach versand über RS232 DataVectorY[1][0] = 0; //Danach versand über RS232 DataVectorY[1][1] = 1; //Danach versand über RS232 usw. Das gleich nochmal mit dem X-Vektor. Funktioniert.
Ehm, ich meinte DataVectorY[0][27] = 27; //Danach versand über RS232
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.