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