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
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);
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.
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.
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 😕.
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?
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.