Forum: Compiler & IDEs ATmega168 - uint16_t array to char über utoa


von Basti (Gast)


Lesenswert?

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

von XXX (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

>  for (k=0, k<30, k++) {

du hast aber nur 28 elemente!

von g457 (Gast)


Lesenswert?

> 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

von Karl H. (kbuchegg)


Lesenswert?

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

von Basti (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Basti (Gast)


Lesenswert?

Ok, danke bis hierher. Dann "hoffe" ich mal, dass es erstma problemfrei 
bleibt :)

von Peter II (Gast)


Lesenswert?

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.

von Basti (Gast)


Lesenswert?

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.

von Basti (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.