Textdatei (String) 1:1 per COM nach Arduino übertragen um dort wieder als String in eine Textdatei gespeichert werden zu können

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    Textdatei (String) 1:1 per COM nach Arduino übertragen um dort wieder als String in eine Textdatei gespeichert werden zu können

    Hallo Leute,

    ich scheitere daran einen mehrzeiligen String über den COM-Port auf Arduino zu transferieren.
    Generell funktioniert es (mit sehr kurzen Strings). Aber wenn der String länger ist, dann fehlen immer irgendwelche Zeilen daraus.

    Hier mein Code (aktuell):

    VB.NET-Quellcode

    1. Dim SendeString As String = "#BEGIN#" + vbCrLf + ConfigContent + vbCrLf + "#END#" 'ConfigContent enhält einen mehrzeiligen String aus einer mehrzeiligen Textdatei
    2. If SerialPort1.IsOpen Then SerialPort1.Close()
    3. SerialPort1.PortName = "COM19"
    4. SerialPort1.BaudRate = 9600
    5. SerialPort1.DataBits = 8
    6. SerialPort1.Parity = Parity.None
    7. SerialPort1.StopBits = StopBits.One
    8. SerialPort1.Handshake = Handshake.None
    9. SerialPort1.Encoding = System.Text.Encoding.Default
    10. SerialPort1.ReadTimeout = 10000
    11. SerialPort1.WriteBufferSize = 100000
    12. Try
    13. SerialPort1.Open()
    14. Catch
    15. MsgBox("Serialport " + SerialPort1.PortName + " not available or blocked by an other application.") 'jetzt nur mal für Debuggen
    16. Exit Sub
    17. End Try
    18. Dim Zeilen() As String = SendeString.Split(Chr(10))
    19. For i As Integer = 0 To Zeilen.Count - 1
    20. If Trim(Zeilen(i)) <> "" Then
    21. SerialPort1.WriteLine(Zeilen(i))
    22. End If
    23. Next i
    24. SerialPort1.Close()


    Hier der Arduino-Code:

    VB.NET-Quellcode

    1. int ByteReceived = 0;
    2. String EmpfangsString = "";
    3. EmpfangsString = ""; //String leeren
    4. while (Serial.available() > 0) {
    5. ByteReceived = 0;
    6. ByteReceived = Serial.read();
    7. EmpfangsString = EmpfangsString + (char)ByteReceived;
    8. }
    9. if (EmpfangsString != "") {
    10. // hier wird der String dann weiterbearbeitet und gespeichert - aber hier fehlen meist viele übermittelte Zeilen - meist in der Mitte des Strings.
    11. }


    Habt Ihr eine Idee, woran es liegen könnte?

    Wenn ich nur ​SerialPort1.Write(SendeString) verwende (also alles auf einmal sende), dann kommt am Arduino nicht alles an.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ja die übertragungen via SerialPort und Arduinos sind so eine Sache. Das einfachste ist zeilenweise Text zu schreiben und ReadStringUntil verwenden. Da du eh Text überträgst, muss du das nicht auf Byte-Ebene machen.
    arduino.cc/reference/en/langua…n/serial/readstringuntil/

    Zum Schluss einfach eine leere Zeile, damit du am Arduino feststellen kannst, wann denn alles da ist.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @DFT
    Habe ich gerade probiert - ändert leider nichts an meinem Problem.
    Es wird der Anfang des Strings und das Ende des Strings übermittelt.

    Ich vermute einmal, dass der ReceivePuffer am Arduino zu klein ist.

    @petaod
    Brachte leider auch keinen Erfolg
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Wie genau hast du das gemacht? Wirklich Zeilenweise? Dann Leerzeile um das Ende zu signalisieren?

    Wie groß ist die Datei, wie lang die längste Zeile? Was passiert auf der anderen Seite mit den Daten? Auf SD-Karte schreiben?

    PS @dive26
    Funktioniert problemlos mit meinen ESP's, Arduinos sind mir zu schlapp, hab keine mehr da um damit zu testen.

    C-Quellcode

    1. String data;
    2. String buffer;
    3. void setup()
    4. {
    5. Serial.begin(115200);
    6. }
    7. void loop()
    8. {
    9. if(Serial.available())
    10. {
    11. data = "";
    12. do
    13. {
    14. buffer = Serial.readStringUntil('\n');
    15. data += buffer;
    16. } while (buffer.length() > 0);
    17. Serial.print(data);
    18. }
    19. }

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. SerialPort1.PortName = "COM1001"
    4. SerialPort1.BaudRate = 115200
    5. SerialPort1.Open()
    6. End Sub
    7. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    8. Debug.WriteLine(SerialPort1.ReadExisting())
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. SerialPort1.WriteLine("Zeile1")
    12. SerialPort1.WriteLine("Zeile2")
    13. SerialPort1.WriteLine("Zeile3")
    14. SerialPort1.WriteLine("Zeile4")
    15. SerialPort1.WriteLine("Zeile5")
    16. SerialPort1.WriteLine("Zeile6")
    17. SerialPort1.WriteLine("Zeile7")
    18. SerialPort1.WriteLine("Zeile8")
    19. SerialPort1.WriteLine("Zeile9")
    20. SerialPort1.WriteLine("Zeile10")
    21. SerialPort1.WriteLine("")
    22. End Sub
    23. End Class



    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    Habe es inzwischen geschafft.
    Das Problem war (wie vermutet) der zu kleine Receive-Puffer.
    Daher kam nicht alles an was ich vom PC weggeschickt habe.
    (Bei kurzen Strings funktionierte alles immer einwandfrei).

    Nun lese ich nach wie vor Byte für Byte aus, sende aber vom PC "langsamer", damit der Puffer garantiert nicht überläuft.
    Sobald die beiden Schlüsselwörter für Anfang und Ende des Strings gelesen wurden, hört das Lesen auf.

    Das funktioniert so für mich.
    Vielleicht werde ich später versuchen, das noch sauberer hinzubekommen.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hatte doch noch einen Arduino(UNO) inner Ramschkiste, hab meinen Code damit getestet, hab 1000 Zeichen auf einen Schlag gesendet, kein Problem, auch mit 2000 nicht.

    PS

    dive26 schrieb:

    while (Serial.available() > 0) {


    Vorm while hast du String = "". Möglicherweise waren kurz keine Daten zum lesen da, dann kam der nächste durchlauf, deshalb fehlten wohl die ersten Zeilen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()