Forum: Mikrocontroller und Digitale Elektronik Große Datenmenge übertragen µC SD-Karte -> PC


von Ersi (cell85)


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

von Falk B. (falk)


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.

von Falk B. (falk)


Lesenswert?

Die einfachste Methode. Einfach die Datei per sprintf() auf den USART 
schreiben und per Terminal mitschneiden und speichern. Da muss man nur 
manuell den Dateinamen eingeben.

von Ersi (cell85)


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.

: Bearbeitet durch User
von Daniel F. (df311)


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)

von oszi40 (Gast)


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.

von dummy (Gast)


Lesenswert?

>Es geht um einen STM32

Die haben doch USB. Also vergiss den UART und implementiere
ein Mass Storage Device.

von Ersi (cell85)


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.

: Bearbeitet durch User
von Falk B. (falk)


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.

von Ersi (cell85)


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.

von Ersi (cell85)


Lesenswert?

zmodem oder lrzmodem ist genau das was ich gesucht habe.
- Einstellbare Blocksize
- CRC32 integriert.

vielleicht gibts da eine weiterentwicklung für embedded systeme oder 
ähnlichem bzw. was z.b MassStorageDevice bentuzt.

von Georg (Gast)


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

von Ersi (cell85)


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.

: Bearbeitet durch User
von Wolle G. (wolleg)


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.

von Ersi (cell85)


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?

von Falk B. (falk)


Lesenswert?

@ Georg (Gast)

>Ignoranz. Alle ernstzunehmenden Protokolle codieren Bytes in
>ASCII-Zeichen.

Wirklich? Ethernet-MAC Layer? UDP? TCP? IP? CAN?
Hmm.

von hmm... (Gast)


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...

von Ersi (cell85)


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...

von hmm... (Gast)


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

von Ersi (cell85)


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.

: Bearbeitet durch User
von Lars R. (lrs)


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.

von S. R. (svenska)


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.

von Glenki (Gast)


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.

von Peter P. (Gast)


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.

von Georg (Gast)


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

von Falk B. (falk)


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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Falk Brunner schrieb:
>>Ignoranz. Alle ernstzunehmenden Protokolle codieren Bytes in
>>ASCII-Zeichen.
>
> Wirklich? Ethernet-MAC Layer? UDP? TCP? IP? CAN?
> Hmm.

 Sind alle nicht ernst zu nehmen. Lachhaft.

von Georg (Gast)


Lesenswert?

Marc Vesely schrieb:
>> Wirklich? Ethernet-MAC Layer? UDP? TCP? IP? CAN?
>> Hmm.
>
>  Sind alle nicht ernst zu nehmen. Lachhaft.

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

Georg

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

 Nimmst du alles so Ernst im Leben ?

von Georg (Gast)


Lesenswert?

Marc Vesely schrieb:
> Nimmst du alles so Ernst im Leben ?

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?

Georg

von Mike (Gast)


Lesenswert?

Georg schrieb:
> Und das nur, weil der TO davon offensichtlich noch nie was
> gehört hat.

... und dann auch noch zu faul ist, mal eben bei Wikipedia nachzugucken, 
was das wohl ist.

von Marc V. (Firma: Vescomp) (logarithmus)


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...

von Ersi (cell85)


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!

von Wolle G. (wolleg)


Lesenswert?

Ersan G. schrieb:
> Es reicht.

Wie schrieb doch
S. R. schrieb:
> Der Ton macht die Musik. Deiner ist unpassend.

Mal sehen, wann es Klick macht.

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.