Forum: Mikrocontroller und Digitale Elektronik sd-Raw_write


von gast (Gast)


Lesenswert?

Hallo,

ich habe das Problem, dass folgende funktion nur einmal funktioniert.
nach dem aufrufen von sd_write schreibt er zwar noch den wert aus der
variablen, jedoch danach nichts mehr auf die karte, auch keine anderen 
Zeichen mehr.


SD Lib von Roland Rigel:
Atmega32L

volatile char lon[11];
uint32_t myoffset = 100;


-> wird mehrfach aufgerufen alle 4 sekunden

sd_raw_write(myoffset,&lon,strlen(lon) )
myoffset++;
sd_raw_sync();

von holger (Gast)


Lesenswert?

Und du meinst aus diesem Codeschnipsel kann man
auf deinen Fehler schliessen? Was steht in lon?
strlen(lon) könnte sonstwas liefern wenn da
kein gültiger String drin steht.

>sd_raw_write(myoffset,&lon,strlen(lon) )

sd_raw_write(myoffset,lon,strlen(lon) )

von gast (Gast)


Lesenswert?

beschreibe ich so:

pToken ist ein NMEA GPGA string den ich aufteile.
lon beinhaltet zu dem zeitpunkt tatsaechlich daten die ich
an ein lcd ausgebe, lon ist also niemals leer und schliest an stelle 10 
immer mit 0 ab.


strncpy(lon,pToken,10);
lon[10] = 0;

von gast (Gast)


Lesenswert?

also ich hab mir selbst mal strlen() ueber itoa() per uart ausgeben 
lassen,
und er zeigt IMMER 10 an.
und direkt danach habe ich auch noch lon ausgeben lassen.
dieser besteht immer aus 10 Zeichen.

von gast (Gast)


Lesenswert?

also ich habs nochmal probiert, irgendwas ist doch an der funktion
von sd_write nicht in ordnung.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Prüfe mal die Pins /CS und DO an der SD-Karte, wenn möglich mit 
Speicheroszi.

von gast (Gast)


Lesenswert?

die Leitungen sind drann, denke ich.

was mir nicht in den kopf will, ich kann stundenlang, MB weise
da drauf schreiben, solange ich nur einzelne zeichen schreibe.
z.B. abwechselnd ein K und ein L.
aber sobald ich einmal den string aus 10 zeichen drauf schreibe, 
schreibt er den und danach is schluss, nix passiert mehr.

von Mario G. (mario)


Lesenswert?

das problem liegt vermutlich im den stringoperationen. poste mal etwas 
mehr code...

von gast (Gast)


Lesenswert?

ok, ich befuelle die variable in der gps.c:

Also das zerlegen des GGA strings funzt auf jedenfall,
ich gebe das auch aufs lcd und uart aus.
1
uint8_t what = 0; // 1 GGA,  2 VTG
2
3
// coord
4
volatile char tim[7];
5
volatile char lat[10];
6
volatile char lon[11];
7
8
// richtungen
9
volatile char latD[2];
10
volatile char lonD[2];
11
12
13
uint8_t ix;
14
ix = 0;
15
what = 0;
16
17
                  char* pToken = strtok(uart_buffer, ",");
18
while( pToken ) {
19
20
                   if ((ix == 0) && (strncmp( uart_buffer, "$GPGGA", 6 ) == 0))  {
21
what = 1;
22
}
23
24
                   if (what == 1) {
25
switch (ix){
26
      case 1:
27
               strncpy(tim,pToken,6);
28
               tim[7] = 0;
29
               myuart_puts("Tim:");
30
               myuart_puts(tim);
31
              break;
32
            case 2:
33
               strncpy(lat,pToken,9);
34
               lat[9] = 0;
35
               myuart_puts("Lat:");
36
               myuart_puts(lat);
37
              break;
38
            case 3:
39
               strncpy(latD,pToken,1);
40
               latD[1] = 0;
41
              break;
42
            case 4:
43
               strncpy(lon,pToken,10);
44
               lon[10] = 0;
45
               myuart_puts("Lon:");
46
               myuart_puts(lon);
47
              break;



und nun die SD zeug:
1
  myuart_puts("StringLen:");
2
  myuart_puts(itoa(strlen(lon),s,10));
3
  myuart_puts(lon);
4
        sd_raw_write(myoffset,lon,strlen(lon));
5
        myoffset++;
6
        sd_raw_sync();

von holger (Gast)


Lesenswert?

Auch wenn es vermutlich das Problem nicht behebt:

>        sd_raw_write(myoffset,lon,strlen(lon));
>        myoffset++;

       myoffset += strlen(lon);

Dürfte da wohl angebracht sein.

von gast (Gast)


Lesenswert?

Du das koennte sogar genau mein Problem sein, ich verschiebe den offset 
ja blos um eins, hab mal ein kleinen trick gemacht

void sdXX(const char *s) {
  while (*s) {
      sd_raw_write(myoffset,s,1);
      myoffset++;
    sd_raw_sync();
      s++;
   }
}


und siehe da, mein problem tritt nicht mehr auf, und warum? weil ich nur 
1 Byte schreibe

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.