Hallo, mein Problem ist das open, print, flush und close mehr zeit brauchen als ein neues Zeichen ankommt. Wärend die Karte beschrieben wird kommen weitere Zeichen an, die leider ignoriert werden. Ich habe bereits Probiert das mit einem Interupt zu lösen, das Problem ist das selbe. Gibt es denoch eine Möglichkeit Daten auf die SD Karte zu schreiben ohne das der Buffer voll wird? Bascom, Atmega32, RS232 mit 9600 Baud. Do Akey = Waitkey() Chrx = Chr(akey) If Len(buff) < Max_buf_len Then Buff = Buff + Chrx Else If Sdpresent = 1 Then Buff = Buff + Chrx Open Tfile For Append As #3 Print #3 , Buff Flush #3 Close #3 Buff = "" Toggle Portc.7 End If End If Loop Vielen Dank
Nimm das Open mal nach oben aus der Schleife raus. Flush und Close machst du hinter die Schleife. Halte die Datei offen solange du schreibst. Damit sollte es schon mal ein wenig besser werden. Open Tfile For Append As #3 Do Akey = Waitkey() Chrx = Chr(akey) If Len(buff) < Max_buf_len Then Buff = Buff + Chrx Else If Sdpresent = 1 Then Buff = Buff + Chrx Print #3 , Buff Buff = "" Toggle Portc.7 End If End If Loop Flush #3 Close #3
Da habe ich aber das problem wann ich Flush ausführe. Ich schreibe ja permanent über RS232 auf die SD Karte, wenn ich dann die spannung weg nehme ohne einem flush/close verliere ich Daten. Eventuell ein Timer der in gewissen abstaenden ein flush durchfuehrt aber auch da wieder das problem, wenn in diesem moment Daten ankommen stoert das die sache.
>Ich schreibe ja permanent über RS232 auf die SD Karte, wenn ich dann >die spannung weg nehme ohne einem flush/close verliere ich Daten. dann erkenn doch das weg nehmen der spannung und führe dann flush/close aus. brown-out-detection und interrupt
>Ich schreibe ja permanent über RS232 auf die SD Karte, wenn ich dann >die spannung weg nehme ohne einem flush/close verliere ich Daten. Genau das sollte man nicht machen. Also Spannung einfach wegnehmen. Was du brauchst ist ein Taster mit dem du die Karte gezielt runterfährst. Lies da mal ein bißchen: Beitrag "SD card: FAT Integrität und power-down / "elektrischem" Ausschalten?" >Eventuell ein Timer der in gewissen abstaenden ein flush durchfuehrt >aber auch da wieder das problem, wenn in diesem moment Daten ankommen >stoert das die sache. Wenn Flush zu langsam ist, dann wirst du dir wohl eine andere Pufferstrategie einfallen lassen müssen.
>dann erkenn doch das weg nehmen der spannung und führe dann flush/close >aus. brown-out-detection und interrupt Dann kannst du die Karte auch ohne die Spannung wegzunehmen einfach rausziehen während geschrieben wird. Interrupt ist hier völlig daneben.
also ich gehe mal davon aus, daß das CLOSE+FLUSH länger dauert als der Abstand zwischen 2 empfangenen Zeichen. Dann ist die Frage, ob ein Interrupt den CLOSE / FLUSH-Befehl unterbrechen darf. Wenn nein, geht es nicht, wenn ja machst Du im Hauptprogramm: do if buffer_voll then ... 'close+flush!, buffer_voll=false loop in der UART-ISR 'Zeichen in den Puffer buffer(index) = udr incr index 'Signal and Hauptprogramm, falls Puffer voll if index > (buf_max) then buffer_voll=true index=1 endif return Besser noch abwechselnd 2 Puffer, damit der eine in Ruhe geschrieben werden kann, während sich der andere füllt.
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.