Laden...

Probleme bei Serieller Kommunikation mit Arduino

Erstellt von KonstanzGlocke vor einem Jahr Letzter Beitrag vor einem Jahr 630 Views
K
KonstanzGlocke Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr
Probleme bei Serieller Kommunikation mit Arduino

Hallo zusammen,

ich möchte mit meinem Arduino über einen COM-Port Kommunizieren. Das funktioniert auch alles soweit einwandfrei, ich habe nur folgendes Problem:
Ich schicke einen Byte-Frame an den Arduino, der verarbeitet diesen richtig und gibt mir eine Antwort.
Diese Funktionalität prüfe ich in einem NUnit-Testprojekt:


SerialPort Port;

        [SetUp]
        public void Setup()
        {
            Port = new SerialPort()
            {
                BaudRate = 9600,
                PortName = "COM4",
                ReadTimeout = 1000,
                WriteTimeout = 1000,
                RtsEnable = false,
                Handshake = Handshake.None
            };

            Port.Open();
        }

        [TearDown]
        public void Teardown() 
        {
            Port.Close();
            Port.Dispose();
        }  

        [Test]
        public async Task ArduinoCommunicationTestOne()
        {
            byte[] data = new byte[10] { 0x00, 0x02, 0x09, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00 };
            byte[] expectedResponse = new byte[9] { 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00 };
            byte[] response = new byte[9];

            Port.Write(data, 0, data.Length);

            await Task.Delay(500);

            Port.Read(response, 0, response.Length);

            await Task.Delay(5000);

            Assert.AreEqual(expectedResponse, response);
        }

Wie gesagt, das funktioniert auch einwandfrei, allerdings schickt mein PC, paar Sekunden nach Beendigung des Tests die Nachricht nochmal an den Arduino und das möchte ich definitiv nicht. Habt ihr dazu eine Idee woran das liegen kann?

Im Anhang habe ich noch den Kommunikationsablauf aus dem Seriellen Monitor.

LG Konstanz

T
708 Beiträge seit 2008
vor einem Jahr

Hi KonstanzGlocke,

ich mache auch viel mit dem Arduino und C#. Aber dieses Verhalte ist mir nicht bekannt!
Bei der allerersten Verbindung startet der Arduino ggf. neu, weil er checkt ob er in den Bootmode gehen soll.
Anschließend kann man den Com-Port aber so oft öffnen und schließen, wie man mag.

Wird der Code auch definitiv nicht zweimal durchlaufen? Breakpoint oder Debug.WriteLine probiert?

Weshalb wartest Du nach dem Empfang der Daten nochmal 5 Sek?


wait Task.Delay(5000);

K
KonstanzGlocke Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr

Hi trip,

der Test ist abgeschlossen der Debugger beendet und der Teardown ist ausgeführt. Bedeutet im Prinzip sollte der Port von C# Seite aus geschlossen sein.

Die 5 Sekunden habe ich nur mal rein gemacht um zu sehen ob diese ungewollte Kommunikation auch stattfindet während der Test noch läuft aber das ist nicht der Fall, hatte an der Stelle auch schon 20 Sekunden getestet. Die ungewollte Kommunikation findet tatsächlich erst statt wenn der Test beendet ist.

T
708 Beiträge seit 2008
vor einem Jahr

Könnnte es dann am Serial Port Monitor liegen?
Leuchtet denn die Rx-LED am Arduino, dass dort auch wirklich 2xDaten ankommen?
Kannst Du denn reproduzieren, dass das Verhalten nicht auftritt, wenn Du keinen Unittest machst?

Nach Port.Close(); passiert bei mir jedenfalls nix mehr.

K
KonstanzGlocke Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr

Guter Einwand!
Also die RX/TX-LEDs am Arduino leuchten auch, also es wird tatsächlich was übertragen und ich hab auch schon LEDs über C# angesteuert, die leuchten dann auch zweimal.
Aber ich werde auf jeden fall mal testen ob es an dem Unittest liegt, was ziemlich blöd wäre, weil ich möchte es in Zukunft eigentlich auch über eine Test-Solution betreiben.

Aber wenn bei dir nach Close() nichts mehr passiert dann ist das schon hart strange 😕.

K
KonstanzGlocke Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr

Shit!
Ok, vielen Dank für die Hilfe trib (diesmal richtig geschrieben 😉 ) es liegt tatsächlich an der Testumgebung.
Ich habe eben das Programm aus einer Konsolenanwendung heraus gestartet und da hat es funktioniert.

Hat dazu vielleicht jemand eine Ahnung, was da NUnit macht?

K
KonstanzGlocke Themenstarter:in
5 Beiträge seit 2022
vor einem Jahr

Nur zur Vollständigkeit hier die Lösung zu meinem Problem:
Der Test ist ein NUnit-Test und wenn solche aus Visual Studio gestartet wird dann wird dieser zweimal durchgeführt. Warum das so ist bin ich noch am rausfinden. Wenn der Test aus der Console heraus gestartet wird ist alles gut und der Test läuft nur einmal durch.