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
> 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.
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.