mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SD Karten Buffer auslesen und verarbeiten


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten morgen.

Habe da mal ne frage. Ich habe einen karten lesegerät gebaut der Daten 
von einer SD karte einliest und dann auf der Com schnitstelle eines mega 
128 ausgibt.

Jetzt habe ich folgendes problem wobei ich nicht weiter komme. Ich habe 
einen buffer von 512 byte (Code von Ulrich Radig).
Da stehen jetzt irgend welche sachen drin, ich lese ein H86 file ein. 
jede zeile der datei fängt mit einem ":" an, danach kommt die länge, das 
high byte, low byte, command, und die daten am ende noch ein checkbyte. 
das funktioniert soweit alles. ich gebe es auch schon richtig aus 
Problem entsteht dann wenn der buffer zu ende ist und neu eingelesen 
werden muss.
Ich weiss ja nicht an welcher stelle ich mich in der datei befinde. noch 
schwieriger wird es weil ich ein H86 File(alles voller Hex zahlen) lese 
aber jede zahl einzeln ein.

ich habe ein kleines File und ein grosses mit folgendem code 
funktioniert das kleine file super. Kann es einlesen und wird auch 
richtig ausgegeben. Aber das Grosse erreicht immer das buffer ende und 
danach kommen nur noch EF´s und wenn das file neu eingelesen wird gibt 
es wieder neue daten kann mir vieleicht jemand sagen wo mein 
Fehler(Möglicher weise Denk fehler)liegt?

Hier noch der Code:

int search_d(char Buffer[], int offset)
{
  // anzahl = Anzahl der zeichen bis zum ":"
  // zehler = Schleifen Zähler
  // dp_pos = die position des Letzten ":"
  int anzahl, zehler, dp_pos,i,x;
  char temp_buffer[50];
  int b,c,d,e, lenge,adrH,adrL, gesendet, CHK;

  anzahl = 0;
  for(zehler=offset+1;zehler<=512;zehler++)
  {
    if(Buffer[zehler]==':')
    {
      //lcd_print("Jump Back    ",4,86,0,Rot,Gruen);
      dp_pos = zehler;
      return(anzahl);
    }//if(Buffer[zehler]==":")
    anzahl++;

  }//for(zehler=0;zehler<sizeof(Buffer);zehler++)

  /************************************************/
  /* hier wird der Rest des Buffers in einen     */
  /* temporeren Buffer kopiert und Buffer neu   */
  /* eingelesen. temp_buffer wird dann gefüllt   */
  /* und ausgegeben. Danach geht man in die     */
  /* die normale routine über            */
  /************************************************/

  for(i=0;i<anzahl;)
  {
    //lcd_print("Bin drin     ",4,86,0,Rot,Gruen);
    temp_buffer[i] = Buffer[dp_pos];
    dp_pos++;
    i++;
  }

  //Datei neu einlesen und buffer mit neuen daten fühlen
  //lcd_print("Lese Datei   ",4,86,0,Rot,Gruen);
  fat_read_file(Cluster,Buffer,(Cluster_offset+1));
  //lcd_print("Datei Gelesen",4,86,0,Rot,Gruen);
  e=0;
  for(x=0;x<=512;x++)
  {
    if(Buffer[x]==':')
    {
      goto weiter;
    }
    e++;
  }

  weiter:
  //lcd_print("Bin Weiter   ",4,86,0,Rot,Gruen);
  for(x=0;x<e;x++)
  {
    //lcd_print("Fülle Buffer",4,86,0,Rot,Gruen);
    temp_buffer[i] = Buffer[x];
    i++;
  }

  for(d=0;d<sizeof(temp_buffer);d++)
  {
  //lcd_print("Prüfe Doppel",4,86,0,Rot,Gruen);
  if(temp_buffer[d] == ':')
  {
    //lcd_print("':' Found      ",4,70,0,Schwarz,Gruen);
    if(temp_buffer[d+8] == '0')
  {
    if(boot == false)
    {
    //lcd_print("Ausgabe      ",4,70,0,Schwarz,Gruen);
           //Chr(1) und Chr(0) verschiken
    loop_until_bit_is_set(UCSR1A, UDRE);
    UDR = 0x01;
    loop_until_bit_is_set(UCSR1A, UDRE);
    UDR = 0x00;
    }
    //---- AdrHigh berechnen und ausgeben-
    //----   wenn nicht das Boot file  ---
    //----        gesendet wird        ---
    adrH=toNumber(temp_buffer[d+3])*16;
    adrH+=toNumber(temp_buffer[d+4]);
    if(boot == false)
    {
    loop_until_bit_is_set(UCSR1A, UDRE);
    UDR = adrH;
    }
    //---- AdrLow berechnen und ausgeben -
    //----   wenn nicht das Boot file  ---
    //----        gesendet wird        ---

    adrL=toNumber(temp_buffer[d+5])*16;
    adrL+=toNumber(temp_buffer[d+6]);
    if(boot == false)
    {
    loop_until_bit_is_set(UCSR1A, UDRE);
    UDR = adrL;
    }

    //---- Länge berechnen und ausgeben -
    //----   wenn nicht das Boot file  ---
    //----        gesendet wird        ---

    lenge=toNumber(temp_buffer[d+1])*16;
    lenge+=toNumber(temp_buffer[d+2]);
    if(boot == false)
    {
      loop_until_bit_is_set(UCSR1A, UDRE);
      UDR = lenge;

      //---------- CHK berechnen ----------
      CHK = 1;
      CHK = CHK + 0;
      CHK = CHK + adrH;
      CHK = CHK + adrL;
      CHK = CHK + lenge;
    }

    //----Daten berechnen und ausgeben----
    i=0;
    //lcd_print("Sende Zeile ",4,86,0,Rot,Gruen);
    for(c=(d+9);i<(lenge);c=c+2)
    {
      gesendet=(toNumber(temp_buffer[c])*16);
      gesendet+=toNumber(temp_buffer[c+1]);
      loop_until_bit_is_set(UCSR1A, UDRE);
      UDR = gesendet;
      i++;
      if(boot==false)
      {
      CHK = CHK + gesendet;

        if(CHK > 255)
        {
          CHK = CHK - 256;
        }
      }
    }
    if(boot == false)
    {
      CHK = (256 - CHK);

             if(CHK == 256)
      {
        CHK = 0;
      }
           loop_until_bit_is_set(UCSR1A, UDRE);
    UDR = (CHK+2);

    for(i=1;i==500;i++)
    {
    //while (!(UCSR1A & (1<<RXC)));// warten bis Zeichen verfuegbar
        //b=UDR;
       }
    switch((char)b)
    {
    case (char)6: lcd_print("Antwort Accept ",4,78,0,Schwarz,Gruen);
    break;

    default:   lcd_print("Falsche Antwort",4,78,0,Rot,Gruen);
    break;
    }
    }//if(bootfile)
  }//if Buffer [d+8] = 0
}//if Buffer[d]= ":"
}
//lcd_print("Bin Raus    ",4,86,0,Rot,Gruen);
return(0);

}//Funktions klammer zu

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie könnte ich in C einen array deklarieren deren grösse erst später 
festgelegt wird? Abhängig von den zeichen die noch kommen?


Bedanke mich schon ma für eure antworten.

Autor: Schubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
malloc?

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.