www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik sd-Raw_write


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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) )

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario Grafe (mario)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das problem liegt vermutlich im den stringoperationen. poste mal etwas 
mehr code...

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

uint8_t what = 0; // 1 GGA,  2 VTG

// coord
volatile char tim[7];
volatile char lat[10];
volatile char lon[11];

// richtungen
volatile char latD[2];
volatile char lonD[2];


uint8_t ix;
ix = 0;
what = 0;

                  char* pToken = strtok(uart_buffer, ",");
while( pToken ) {

                   if ((ix == 0) && (strncmp( uart_buffer, "$GPGGA", 6 ) == 0))  {
what = 1;
}

                   if (what == 1) {
switch (ix){
      case 1:
               strncpy(tim,pToken,6);
               tim[7] = 0;
               myuart_puts("Tim:");
               myuart_puts(tim);
              break;
            case 2:
               strncpy(lat,pToken,9);
               lat[9] = 0;
               myuart_puts("Lat:");
               myuart_puts(lat);
              break;
            case 3:
               strncpy(latD,pToken,1);
               latD[1] = 0;
              break;
            case 4:
               strncpy(lon,pToken,10);
               lon[10] = 0;
               myuart_puts("Lon:");
               myuart_puts(lon);
              break;




und nun die SD zeug:
  myuart_puts("StringLen:");
  myuart_puts(itoa(strlen(lon),s,10));
  myuart_puts(lon);
        sd_raw_write(myoffset,lon,strlen(lon));
        myoffset++;
        sd_raw_sync();


Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.