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


von Der G. (jonnyk)


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

von Der G. (jonnyk)


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.

von Schubi (Gast)


Lesenswert?

malloc?

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.