Große Datenmenge übertragen µC SD-Karte -> PC

OP #3790262
Lesenswert?

Hi,
ich würde gerne wissen wie man am geschicktesten ohne großen Ram/Puffer 
Daten einer SD-Karte (Fatfs) über eine UART an einen PC überträgt (UART 
in meinem Fall => Virtual-ComPort USB).
Es geht um einen STM32 Temperatur und Feuchtigkeitslogger welcher die 
Daten in Tages-Dateien speichert YYmmdd.log Alle 24std gibts eine neue 
Datei.
Ich habe viele einzelne Dateien welche aufgezeichnet werden, diese sind 
so ca. 30KB pro Stück groß.
Wie macht man das nun ? Überträgt man immer Packetweise die Datei rüber?
Oder gibts eine Methode wo ich nur die größe der Datei angebe und mein 
Transerfunktion übertägt so lange bis der Bytezähler == Anzahl der Bytes 
erreicht hat?

Würde mich wirklich interessieren.

Gruß
Ersan
#3790277
Lesenswert?

@ Ersan G. (cell85)

>ich würde gerne wissen wie man am geschicktesten ohne großen Ram/Puffer
>Daten einer SD-Karte (Fatfs) über eine UART an einen PC überträgt (UART
>in meinem Fall => Virtual-ComPort USB).

Gar nicht? Einfach die Karte ziehen und in den PC stecken?

>Es geht um einen STM32 Temperatur und Feuchtigkeitslogger welcher die
>Daten in Tages-Dateien speichert YYmmdd.log Alle 24std gibts eine neue
>Datei.
>Ich habe viele einzelne Dateien welche aufgezeichnet werden, diese sind
>so ca. 30KB pro Stück groß.
>Wie macht man das nun ? Überträgt man immer Packetweise die Datei rüber?

Mit den altbekannten Methoden ala X,Y,Z-Modem oder Kermit-Protokoll.

>Oder gibts eine Methode wo ich nur die größe der Datei angebe und mein
>Transerfunktion übertägt so lange bis der Bytezähler == Anzahl der Bytes
>erreicht hat?

Siehe oben.
OP #3790292
Lesenswert?

Hi Falk,

Ich such schon nach einer ordentlichen Methode und nich die einfachste.
Ich hab ein VisualStudio Host Programm das die Daten visualisiert. Im 
moment nur mit offline Daten.

Ein string kommt nicht in frage da die datenmenge sonst aufbläht. Ich 
serialisiere die daten und deserialisiere sie.

Ähnlich wie bei einer UDP übertragung eben.

Nur bisher hatte ich immer Livedaten übertragen und keine auf der SD 
Karte gespeicherten.

VG


Btw. SD karte abziehen ist auch keine Lösung.
#3790319
Lesenswert?

Ersan G. schrieb:
> VisualStudio Host Programm das die Daten visualisiert. Im
> moment nur mit offline Daten.

na dann verpass dem host doch einfach eine möglichkeit, daten von der 
rs232 zu lesen - die schreibst du so wie sie reinkommen in eine datei. 
um das ganze auch gleich in die richtige datei zu schreiben solltest du 
dir ein einfaches protokoll einfallen lassen, mit dem du z.b. dateiname, 
länge, ... mitschickst.
tipp: in den ersten 31 zeichen der ascii-tabelle findest du jede menge 
praktische steuerzeichen, die für so ein protokoll verwendet werden 
können)

danach bekommt der host eine möglichkeit dateien zu öffnen/lesen, diese 
daten werden dann visualisiert.

da die übertragung per rs232 sowieso zeichen-/byteweise erfolgt ist es 
prinzipiell wurscht ob du alles auf einmal schickst (protokoll) oder 
jede datei einzeln (anderes protokoll).

Ersan G. schrieb:
> Ein string kommt nicht in frage da die datenmenge sonst aufbläht. Ich
> serialisiere die daten und deserialisiere sie.

wenn die daten nicht als string in der datei gespeichert sind, dann wird 
nur das protokoll ein bisschen komplexer, an der übertragungsform an 
sich ändert sich nichts (rs232 bleibt mehr oder weniger byteweise - je 
nach anzahl der datenbits)
Gast #3790346
Lesenswert?

Je nach Anwendung/Protokoll würde ich mal noch eine zusätzliche Prüfzahl 
bilden und mit übertragen um sicher zu sein, dass Du ALLE gewünschten 
Daten übertragen hast. Gelegentlich geht irgendwann was verloren, wenn 
z.B. plötzlich die Spannung fehlt.
OP #3790372
Lesenswert?

Hi Daniel,

ja es besteht bereits eine serielle Verbindung am Host. Das ist ja nicht 
das Problem.

Es geht mir schlicht und einfach darum, wie ich eine große Datei per 
UART übertrage.
Ich glaub ich muss mein Problem verständlicher machen:

0815 Datenübertragung:
Daten per UART als ASCII String senden, Host empfängt Ascii String.


Datenübertagung:

Daten werden in eineArray geloggt in bspw. MyDataArray[sizeofArray].
Übertragung an den PC mittels myUARTSend(bytearray, sizeOfByteArray).
Ohne Puffer mit der Größe meines Arrays.

Kein String oder sprintf, ASCII benutzt man normalerweise nicht für 
sowas.

Also was ich suche ist eine Methode/Funktion die mein großes DatenPaket 
stückweise durch die UART schiebt. Die Methode bekommt das Array und die 
Größe des Arrays.

Ein CRC32 kann ich ja für jedes Paket erstellen und mitsenden.

Ahh ich glaub das ist alles nich so einfach.


@Gast Ich benutze momentan USB VCP. Wenn das Gerät aber 200m weit weg 
liegt, würde ich halt gerne UART benutzen (nicht RS232 sondern RS485 als 
physical layer). Daher kommt die MSD class auch nicht in Frage, wäre 
natürlich aber die Lösung aller Probleme, dann müsste ich aber noch eine 
Möglichkeit finden um damit zu kommunizieren, denn VCP und MSD geht 
nicht parallel.
#3790388
Lesenswert?

@Ersan G. (cell85)

>Kein String oder sprintf, ASCII benutzt man normalerweise nicht für
>sowas.

Doch, warum nicht. Wenn aber deine Daten binär gesopeichert sind, erhöht 
das natürlich die Datenmenge.

>Also was ich suche ist eine Methode/Funktion die mein großes DatenPaket
>stückweise durch die UART schiebt. Die Methode bekommt das Array und die
>Größe des Arrays.

google X,Y,Z-Modem oder Kermit

>Ein CRC32 kann ich ja für jedes Paket erstellen und mitsenden.

Ist dort drin.

>Ahh ich glaub das ist alles nich so einfach.

Doch.
OP #3790405
Lesenswert?

@Falk ich dachte du veräpplest mich mit XYZ und Kermit ... lol
Ich schau mir das an.


Ich übertrage immer gerne Bytes und nicht ascii :

10 Integer mit 32Bit => 40Byte

Ein String mit 10x 4 bis 8 Zeichen je Integer + leerzeichen + \n =>  im 
normalfall 60byte und im schlimmsten 100byte.
Gast #3790635
Lesenswert?

Ersan G. schrieb:
> Ich übertrage immer gerne Bytes und nicht ascii :

Weil du die Problematik überhaupt nicht verstehst. Bei binären Daten 
sind alle 255 möglichen Kombinationen möglich und gültig, also gibt es 
keine reservieretn Zeichen für Start, Stop und Fehlerpüfung wie mit 
ASCII.

Die Leute, die Kermit und XYZ-Modem entwickelt haben, waren dir da 
Lichtjahre voraus, dass du dich da veräppelt fühlst liegt an deiner 
Ignoranz. Alle ernstzunehmenden Protokolle codieren Bytes in 
ASCII-Zeichen.

Georg
OP #3790694
Lesenswert?

Georg, was kommt dir in den Sinn mich zu beleidigen nur weil du zum 
lesen zu unfähig bist? Was ich gesucht habe war so etwas wie eine 
z-modem Übertragung.

Ich weiß auch nicht was du von irgendwelchen reservierten Zeichen 
laberst und das ich behaupte in ASCII zu codieren. Pack deine Koffer und 
geh.

Was ich oben beschrieben hab war mein Datentelegramm Header und Tail, 
wenn du das meinst - das hat rein garnichts mit dem zu tun.
#3790710
Lesenswert?

Ersan G. schrieb:
>Es geht um einen STM32 Temperatur und Feuchtigkeitslogger welcher die
>Daten in Tages-Dateien speichert YYmmdd.log Alle 24std gibts eine neue
>Datei.

Offensichtlich hast Du Dich schon festgelegt. Aber was spricht gegen die 
Methode von Falk?
>Einfach die Karte ziehen und in den PC stecken?

Nach dieser Methode schreibe ich z. B alle 8s 8 Messwerte(je 16 Bit) in 
eine auf der SD-karte befindlichen Datei von z.Z. 75MB und kann damit 
ca. 4 Monate die Daten aufzeichnen.
Die SD-Karte kann jederzeit im PC gelesen werden. Die von der SD-Karte 
gelesenen Daten werden dann mit einem Programm gewandelt und konnen z.B. 
als Diagramm dargestellt werden.
75MB ist noch nicht die Obergrenze.
OP #3790737
Lesenswert?

Hi Wolle,
lese doch bitte mein Text. Ich hab doch schon längst gesagt das ich 
Z-Modem versuchen werde! Es gibt auch einen port für Linux (GNU) den 
kann ich direkt ausprobieren.

>@Falk ich dachte du veräpplest mich mit XYZ und Kermit ... lol
>Ich schau mir das an.

Benutzt du Z-Modem oder x,y, kermit?

Das was du machst ist genau das was ich  auch machen will. Ich lese die 
Daten aus der SD-Karte aus und will Sie plotten in VisualBasic und HTML 
mit GoogleCharts.
Ich nehme an du hast es aber nicht opensource?
Gast #3790852
Lesenswert?

Wo ist eigentlich die große Datei jetzt? Selbst 1Mbyte dauert mit einem 
modernem FTDI bei einem MBit inklusive Overhead für Prüfsummen keine 
10min.

Also Hardwareseitig einfach irgendeinen USB auf Seriellwandler Chip 
nehmen und dann per ZModem Rüber schieben. Simpelvariante wäre über 
jeweils 1024 Byte eine Prüfsumme berechnen und dann senden. Wenn beim 
Host die Prüfsumme nicht passt kommt eine 1 als nack, sonst eine 2 als 
ack. Man kann Dinge auch künstlich Verkomplizieren...
OP #3790856
Lesenswert?

hmm... schrieb:
> Wo ist eigentlich die große Datei jetzt? Selbst 1Mbyte dauert mit einem
> modernem FTDI bei einem MBit inklusive Overhead für Prüfsummen keine
> 10min.
es geht um RAM-schonung, kleiner puffer durch geeignete protokolle..

> Also Hardwareseitig einfach irgendeinen USB auf Seriellwandler Chip
leeeesen!
> nehmen und dann per ZModem Rüber schieben. Simpelvariante wäre über
> jeweils 1024 Byte eine Prüfsumme berechnen und dann senden. Wenn beim
> Host die Prüfsumme nicht passt kommt eine 1 als nack, sonst eine 2 als
> ack. Man kann Dinge auch künstlich Verkomplizieren...
lesen...
Gast #3790864
Lesenswert?

Ja,und was soll ich lesen? Das alle 24h mickrige 30kb über eine 
virtuelle Uart rein tröpfeln? Oder das dir keines der vorgeschlagenen 
Protokolle gefällt weil du noch nie davon gehört hast? Was genau ist dir 
den zu langsam? In der Zeit die du hier Leute anpöbelst die dir Lösungen 
vorschlagen hätte man das locker schon implementieren können.

Ich bin raus
OP #3790867
Lesenswert?

junge....junge... ich pöbel niemanden an ... die  lösung wurde doch 
schon von Falk gegeben => zmodem! ich implentiere es gerade.

wo ist der sinn noch irgendwie was hier zu kritisieren???
Troll?

ps. was ist das denn für eine Mentalität bitte schön?? natürlich frage 
ich hier in einem Forum nach Ratschlägen... die vorraussetzung ist 
unwissenheit, ich komm ja nicht hier her um Wissen zu bestätigen.
#3790880
Lesenswert?

Antwort auf Frage:

Paketbasierte Übertragung:
Byte 1: Was wird gesendet.
Byte 2: Wieviele Bytes werden gesendet (max. 255)

Möglichkeiten für Byte 1:
"Dateiname", "Dateidaten", "Ich schließe jetzt die Verbindung", 
"Verbindung offen, bitte bestätigen", "Verbindung offen, hiermit 
bestätigt", "Fehler", usw.

Wenn Du magst noch ein reserviertes Zeichen als Byte0. Es ist egal 
welches.

Mindestens auf Empfängerseite: Timeout für Read

Der Betreff sagt große Datenmenge. Aber wie groß ist die Datenmenge? 
Damit sind doch nicht die 30kByte gemeint, oder?

Prüfsumme: Wozu? Im Anforderungskatalog des TE ist es nicht enthalten.

ASCII: Wozu, wenn es Binärdaten sind?

Steuerzeichen: Wozu?

ZMODEM: Wozu?

Alles etwas durcheinander, hier.
#3790936
Lesenswert?

Das liegt schlicht daran, dass der TE nicht der Meinung ist, mit offenen 
Karten spielen zu müssen. Die Glaskugel hat etwas dem TE genehmes 
ausgespuckt - ob es die optimale oder passende Lösung ist, wissen wir 
nicht.

Ersan G. schrieb:
> ps. was ist das denn für eine Mentalität bitte schön?? natürlich frage
> ich hier in einem Forum nach Ratschlägen... die vorraussetzung ist
> unwissenheit, ich komm ja nicht hier her um Wissen zu bestätigen.

Der Ton macht die Musik. Deiner ist unpassend. Als Fragesteller fragt 
man nett und analysiert die Antworten. Antworten, die man nicht 
versteht, beantwortet man nicht mit Pöbeleien gegenüber dem, der sie 
geäußert hat. Außerdem enthältst du uns wesentliche Informationen vor.

Wenn du UDP bereits kannst, könntest du auch SLIP implementieren und 
darüber schlichtes HTTP fahren. Eine Weiterentwicklung von ZMODEM... da 
bist du ein paar Tage zu spät dran, denke ich.
Gast #3790941
Lesenswert?

Für mich siehts aber aus das sich eher Georg im Ton vergriffen und der 
TO darauf reagiert hat. Ist auch nicht die Feine Art, ihn als Ignorant 
zu bezeichnen wenn man an sich vorbeiredet.

Was hat UDP socket Programmierung mit der Frage zu tun das er Daten aus 
einer SDcard ziehen will? Er brauch auch kein SLIP...

Für mich ist die Sache eindeutig.

Das Problem ist hier, dass er die Daten auf der Speicherkarte nicht 
komplett allokieren will und Packetweise übertragen möchte.
Das macht XZYModem und andere Layer ebenfalls.

Du kannst auch ganz einfach immer 4kB Blockweise versenden und an jedem 
Block ein crc danhängen - 2 Std. Programmierung und Ressourcenschonend.
Gast #3790978
Lesenswert?

Es gibt auch noch 2 Möglichkeiten der Start der Übertragung:

- Sendet das Gerät die Daten selbständig zum PC (wann es Lust hat)
  oder zumindest wenn der PC (und die Empfangssoftware) bereit ist?

- Fordert der PC die Daten an?
  Soll der PC gezielt Daten holen können (z.B. gib mir alle Daten
  vom 26.06. dieses Jahres) oder soll er immer nur die Daten, die seid
  der letzten Abfrage gesammelt wurden.

Für Variante 2 gibt es auch noch ein Protokoll namens OBEX,
(OBEX = Object Exchange, wurde auch mal für IrDA benutzt)
nicht so bekannt wie Z-Modem, wird aber in vielen Mobiltelefonen
mit Bluetooth (Stich VCARD) verwendet und bei manchen auch via
seriellem Port. Soweit ich mich erinnern kann, gab es da aber
keine Prüfsumme, ließe sich aber einfach im Protokoll erweitern.
Es ist ein relativ einfaches Protokoll, weiß aber nicht wie
aufwendig Z-Modem ist. Bei Z-Modem findest du wahrscheinlich auf
der PC-Seite um Faktoren mehr Implementierungen.

Zum Problem: Keine großen Buffer. Du ließt die Daten ja bereits 
irgendwie
von der SD-Karte. Diese Anzahl von Daten schickst du direkt auf die
serielle Schnittstelle (oder halt irgendwie aufbereitet, als ASCII,
oder base64, oder,... wie es deine Empfangssoftware haben will.
Davon vermutlich noch einen Header, dahinter ein paar Bytes als
Abschluss.
Gast #3791182
Lesenswert?

Glenki schrieb:
> Ist auch nicht die Feine Art, ihn als Ignorant
> zu bezeichnen

Das mit der Ignoranz hatte einen ganz konkreten Grund: Falk hat 
X,Y,Z-Modem vorgeschlagen und der TO hat geantwortet

Ersan G. schrieb:
> Falk ich dachte du veräpplest mich mit XYZ und Kermit

Das finde ICH nun nicht die richtige Art, auf einen ernsten Vorschlag zu 
antworten. Und das nur, weil der TO davon offensichtlich noch nie was 
gehört hat.

Georg
#3791313
Lesenswert?

@ Georg (Gast)

>> Falk ich dachte du veräpplest mich mit XYZ und Kermit

>Das finde ICH nun nicht die richtige Art, auf einen ernsten Vorschlag zu
>antworten.

Mein Gott, nun lass mal die Kirche im Dorf! Das ist ja nun weiß Gott 
harmlos, da gibt es ganz andere Rabauken hier.
(Firma: Vescomp) #3791973
Lesenswert?

Georg schrieb:
> Nicht alles, aber Fragen die hier gestellt werden schon - folglich
> schwafle ich nicht von TDP und UDP, wenn jemand Daten über ein UART
> übertragen will. Oder sind die Threads hier für dich nur ein Witz?

 Falk hat auf Behauptung reagiert, dass alle ernsthaften Protokolle
 ASCII übertragen.
 Ich gab ihm Recht, wenn auch in nicht ganz ernsthafter Form.

 Somit:

Georg schrieb:
> Lesen hilft verstehen: es ging um eine asynchrone serielle
> Schnittstelle.

 Lesen hilft verstehen: es ging um Übertragung und Protokolle,
 also schwafle nicht von irgendeiner Schnittstelle, wo gar keine ist...
OP #3791977
Lesenswert?

Es reicht. natürlich habe ich danach gegoogelt wieso war meine zweite 
Antwort denn sofort, das ich z modem probieren werde!
Ich denke die Moderatoren sollten nutzlose Kommentare löschen.

Ich habe Falk auch nie angepöbelt. Mir hat Kermit nichts gesagt und ich 
dachte erstmal er will mich mit der Muppet-Show auf den Arm nehmen :))

Ich bin Falk dankbar!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren