Files von SD-Karte auf Computer übertragen

Guten Tag zusammen,
ich weiß nicht, wie cross postings hier gehandhabt werden, aber ich hoffe, nicht gegen Regelungen zu verstossen, wenn ich hier ein Problem schildere, auf das ich im internationalen Forum keine Antwort bekomme (https://forum.arduino.cc/index.php?topic=511263.0). Es geht um folgendes:
Ich habe einen Mega geklont und mit diversen Sensoren bestückt, deren Messdaten ich auf einer SD-Karte speichere. Da das Gerät mindestens spritzwasserfest sein soll, möchte ich die Daten via USB übertragen, so dass ich nur einen wasserdichten Stecker (und Schalter) brauche, und nicht immmer alles zerlegen und wieder zusammensetzen muss. Früher habe ich dafür den MAX14502 benutzt, aber den gibts nicht mehr, und den AU6331 krieg ich nicht zum laufen (beide emulieren einen USB-Stick, sa dass Daten bequem im Dateimanager kopiert werden können). Außerdem war früher sowieso kein Platz mehr im Programmspeicher, um noch viel reinzupacken, denn da hab ich nur einen Leonardo geklont.
Ich habe jetzt mit Hilfe der Beispiele der SdFat-Library einen sketch fertig bekommen, der auf drei verschiedene Kommandos hin

  1. auf Kommando die Dateien im root Ordner zählt und das Ergebnis über Serial rausschickt,
  2. auf Kommando den Dateinamen rausschickt,
  3. auf Kommando die Daten zeilenweise rausschickt,
  4. die Datei umbenennt, so dass sie in einem anderen Ordner landet, und
  5. das solange macht, wie Dateien im root sind.
    Das funktionert zumindest mit dem Serial Monitor. Ich hätte jetzt aber gerne eine Windows App, die das selber bis zum Ende macht. Leider habe ich keinerlei Programmiererfahrung damit, also hab ich fleißig youtube durchstöbert und folgendes zusammengeklaubt:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace FileDownloader02
    {
    public partial class Form1 : Form
        {

        private SerialPort myport;
        private string in_data;
        private string filename;
        private Int16 file_number;
        private string path;
        String[] ports;
        UInt16 i;

        public Form1()
            {
            InitializeComponent();
            getAvailableComPorts();

                    foreach (string myport in ports)
                {
                comboBox1.Items.Add(myport);
                Console.WriteLine(myport);
                if (ports[0] != null)
                    {
                    comboBox1.SelectedItem = ports[0];
                    }

                }
                    btn_dwnload.Enabled = false;
                    btn_disconnect.Enabled = false;
                    btn_count_files.Enabled = false;
            }

        private void getAvailableComPorts()
            {
            ports = SerialPort.GetPortNames();
            }

        private void Form1_Load(object sender, EventArgs e)
            {

            }


        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {

            }

        private void btn_connect_MouseClick(object sender, MouseEventArgs e)
            {
            myport = new SerialPort();
            string selectedPort = comboBox1.GetItemText(comboBox1.SelectedItem);
            myport.BaudRate = Convert.ToInt32(tb_baud_rate.Text);
            myport.PortName = selectedPort;
            myport.Parity = Parity.None;
            myport.DataBits = 8;
            myport.StopBits = StopBits.One;

            try
                {
                myport.Open();
                }
            catch (Exception ex)
                {
                MessageBox.Show(ex.Message, "Wrong Port");
                }
            btn_dwnload.Enabled = true;
            btn_disconnect.Enabled = true;
            btn_count_files.Enabled = true;
            }

        private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
            in_data = myport.ReadLine();
            this.Invoke(new EventHandler(saveline_event));
            }

        private void btn_disconnect_MouseClick(object sender, MouseEventArgs e)
            {
            try
                {
                myport.Close();
                }
            catch (Exception ex2)
                {
                MessageBox.Show(ex2.Message, "Oops...");
                }
            btn_disconnect.Enabled = false;
            btn_dwnload.Enabled = false;
            btn_count_files.Enabled = false;
            }

        private void btn_count_files_MouseClick(object sender, MouseEventArgs e)
            {
            myport.WriteLine("c"); //c for count
            try
                {
                file_number = Convert.ToInt16(myport.ReadLine());
                }
            catch (Exception ex2)
                {
                MessageBox.Show(ex2.Message, "No Answer");
                throw;
                }
            tb_count_files.Text = file_number.ToString();
            }

        private void btn_dwnload_MouseClick(object sender, MouseEventArgs e)
            {
            for (i = 0; i <= file_number; i++)
                {
                myport.WriteLine("n"); //send n for name
                try
                    {
                    filename = myport.ReadLine();
                    }
                catch (Exception ex3)
                    {
                    MessageBox.Show(ex3.Message, "No Answer");
                    throw;
                    }
                path = tb_pathname.Text;

                myport.WriteLine("s"); //send s for send file
                
                myport.DataReceived += myport_DataReceived;

                }
            }
            
        private void saveline_event(object sender, EventArgs e)
            {
            System.IO.File.AppendAllText(path + filename, in_data);
            }

        private void btn_dwnload_Click(object sender, EventArgs e)
            {

            }
        }
    }

Es funktioneirt bereits, den Port und die baudrate zu wählen, zu verbinden und die Anzahl der verfügbaren Files angezeigt zu bekommen. Aber jetzt wirds schwierig.
Ich habe gedacht, das sicherste wäre eine while-Schleife, die so oft durchläuft, wie ich files habe, denn den Wert habe ich ja. In jedem Durchlauf fragt der Rechner nach dem Dateinamen (wenn er ihn bekommt, kann man ihn auch anzeigen), und dann schiebt er einfach mit dem saveline_event alles rein, was kommt. Dann könnte man vielleicht per timeout feststellen, wenn das File zuende ist, und den nächsten Namen anfragen usw. saveline_event funktionert schon insofern, dass ich es geschafft habe, eine Datei mit einem Datenstrom, der automatisch reingekommen ist, zu füllen.
Im Moment geht da gar nichts, vermutlich, weil mein Verständnis der tatsächlichen Abläufe in so einem Programm rudimentär oder inkorrekt ist. Es gibt ja eher keinen loop, sondern Eregnisse, die man dann timen und abhandeln muss.
Es wäre schön, wenn jemand eine Richtung vorgeben könnte, in der ich weiter rumprobieren kann. Ich bin doch nicht der einzige, der sowas praktisch finden würde?!
Vielen Dank im voraus, Grüße
Sebastian

Crossposting ist gar nicht gerne gesehen.

Wenn Du Hilfe für ein Windowsprogramm brauchst ist das hier der falsche Platz.

Anstatt die Sd-Karte vom PC aus über USB sichtbar zu machen kannst Du deren Inhalt über die USB als serielle Schnittstelle vom Arduino an den PC schicken lassen.

Hast Du bei Maximintegrated nachgefragt ob ein Ersatzmodel verfügbar ist.

Grüße Uwe

Crossposting ist gar nicht gerne gesehen.

Oh. OK, sorry, das merk ich mir.

Wenn Du Hilfe für ein Windowsprogramm brauchst ist das hier der falsche Platz.

Dann bin ich wenigstens nicht der einzige: https://forum.arduino.cc/index.php?topic=436791.0 und https://forum.arduino.cc/index.php?topic=438582. Ich hatte auf Hilfe gehofft, weil hier vielleicht mehr Quereinsteiger zu finden sind als in einem C#-Forum.

Anstatt die Sd-Karte vom PC aus über USB sichtbar zu machen kannst Du deren Inhalt über die USB als serielle Schnittstelle vom Arduino an den PC schicken lassen.

Nun ja, ersteres soll ja angeblich mit LUFA gehen, aber das ist mir zu hoch. Und ich mache ja genau das, was Du vorschlägst, ich muss es dann nur halt irgendwie “auffangen”.

Hast Du bei Maximintegrated nachgefragt ob ein Ersatzmodel verfügbar ist.

Maxim hat gegenwärtig keine Absicht, eine Neuauflage oder einen Nachfolger aufzulegen. Warum auch? Ich denke mal, dass in aktuellen Mikrocontrolern genug Speicher und Rechenleistung vorhanden ist, um so eine Funktionalität zu implementieren.

Gruß
Sebastian