Problem bei Kommunikation mit Arduino wenn Baud Rate erhöht wird

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von LuaX.

    Problem bei Kommunikation mit Arduino wenn Baud Rate erhöht wird

    Ich habe vor zwei Tagen angefangen etwas mit meinem Arduino herum zu experimentieren. Also schrieb ich mehrere Programme die auch alle gut funktionierten. Da ich die Daten über die serielle Schnittstelle übertrug und diese auf 9600 konfiguriert war, war die Verbindung relativ langsam. Somit entschied ich mich die Baud Rate auf beiden Geräten zu erhöhen... Danach funktionierte Garnichts mehr. Nachdem ich alles wieder zurückgestellt hatte lief es wieder tadellos. Da ich aber trotzdem nicht auf die höhere Baudrate verzichten will, möchte ich wissen ob ich irgendwelche Einstellungen neben der Baudrate treffen muss, damit ich Daten übertragen kann. Über den Seriellen Monitor des Arduinoprogramms funktioniert auch alles, nur eben nicht mit meinem Programm.

    Net Code

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Module Module1
    3. Sub Main()
    4. Dim x As New SerialPort
    5. x.BaudRate = 115200
    6. x.PortName = "COM3"
    7. x.Open()
    8. Dim testdata() As Byte = {0, 1, 2, 3, 4, 5, 6}
    9. x.Write(testdata, 0, testdata.Length)
    10. While x.BytesToRead < testdata.Length Or x.BytesToWrite > 0
    11. End While
    12. Dim dbgbuffer(testdata.Length - 1) As Byte
    13. x.Read(dbgbuffer, 0, testdata.Length)
    14. For i = 0 To testdata.Length - 1
    15. If Not testdata(i) = dbgbuffer(i) Then
    16. Console.WriteLine("error")
    17. Console.Read()
    18. Exit Sub
    19. End If
    20. Next
    21. x.Close()
    22. Console.WriteLine("Connection ok")
    23. Console.Read()
    24. End Sub
    25. End Module


    Arduino Code

    C-Quellcode

    1. void setup() {
    2. Serial.begin(115200);
    3. }
    4. void loop() {
    5. while (Serial.available() > 0) {
    6. Serial.write(Serial.read());
    7. }
    8. }




    (In beiden Codes muss natürlich die Baud rate verändert werden)

    Schonmal danke im Vorraus,
    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Habe mit deinem Programm den gleichen Fehler gehabt. Daraufhin habe ich mal einen ähnlichen Test geschrieben und eine interessante Entdeckung gemacht:

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. const int n = 2;
    4. Random r = new Random();
    5. var sp = new SerialPort();
    6. sp.BaudRate = 115200;
    7. sp.PortName = "COM3";
    8. sp.Open();
    9. byte[] buffer = new byte[n];
    10. byte[] readbuffer = new byte[n];
    11. for (int i = 0; i <= 30; i++)
    12. {
    13. r.NextBytes(buffer);
    14. sp.Write(buffer, 0, n);
    15. while(sp.BytesToRead < n) { }
    16. sp.Read(readbuffer, 0, n);
    17. for (int j = 0; j < n; j++)
    18. {
    19. if (buffer[j] != readbuffer[j])
    20. {
    21. Console.WriteLine("error");
    22. continue;
    23. }
    24. }
    25. Console.WriteLine("Connection ok");
    26. }
    27. sp.Close();
    28. Console.ReadKey();
    29. }


    Die Ausgabe sieht so aus:

    Quellcode

    1. error
    2. Connection ok
    3. error
    4. Connection ok
    5. ...


    Wenn ich als bspw. n = 4 wähle, sieht das so aus:

    Quellcode

    1. error
    2. error
    3. error
    4. error
    5. Connection ok
    6. error
    7. error
    8. error
    9. error
    10. Connection ok


    Ziemlich sicher also ein Buffer-Problem. Habe dann noch ein paar andere Sachen getestet. Hiermit:

    C#-Quellcode

    1. Random r = new Random();
    2. var sp = new SerialPort();
    3. sp.BaudRate = 115200;
    4. sp.PortName = "COM3";
    5. sp.Open();
    6. byte[] data = new byte[50];
    7. r.NextBytes(data);
    8. for (int i = 0; i < 50; i++)
    9. {
    10. sp.Write(new byte[]{ data[i] }, 0, 1);
    11. byte tb = (byte)sp.ReadByte();
    12. Console.WriteLine("SENT: " + data[i] + "\t\tREC: " + tb + "\t\t" + (data[i] == tb ? "GOOD" : "BAD"));
    13. }
    14. sp.Close();
    15. Console.ReadKey();

    habe ich herausgefunden, dass am Anfang immer ein paar 240-er Bytes zurückkommen.
    Kurz gegoogled - offensichtlich sendet .NET beim Öffnen einer seriellen Verbindung immer 240-bytes am Anfang, warum auch immer. sp.DiscardInBuffer(); direkt nach sp.Open(); hat bei mir geholfen.
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    Ok super danke!

    Ich werd mir anschauen wieviele 240er gesendet werden u mein Script auf dem Arduino darauf anpassen.

    Edit: VB.NET:

    Visual Basic-Quellcode

    1. com1.open()
    2. com1.Write("go")

    Arduino:

    Quellcode

    1. While (Serial.read() != 111) { //111="o"
    2. delay(1);
    3. }


    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

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

    Du könntest aber auch einfach versuchen in .Net den "Handshake" auszuschalten
    こんにちわ
    Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.