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
@ 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.
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.
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
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)
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.
>Es geht um einen STM32
Die haben doch USB. Also vergiss den UART und implementiere
ein Mass Storage Device.
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
@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.
@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.
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.
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
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
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.
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?
@ Georg (Gast) >Ignoranz. Alle ernstzunehmenden Protokolle codieren Bytes in >ASCII-Zeichen. Wirklich? Ethernet-MAC Layer? UDP? TCP? IP? CAN? Hmm.
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...
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...
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
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
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.
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.
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.
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.
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
@ 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.
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.
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
Georg schrieb: > Lesen hilft verstehen: es ging um eine asynchrone serielle > Schnittstelle. Nimmst du alles so Ernst im Leben ?
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
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.
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...
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.