Probleme mit serieller Schnittstelle (C#)

Hallo an alle!

Ich habe ein kleines Problem und komme seit 2 Tagen nicht weiter.

Ein kleines C# Programm soll mir über die Serielle Schnittstelle Steuerbefehle (#b, #w, …) an den Arduino senden.
Sende ich die Steuerbefehle über den Seriellen Monitor in der Arduino IDE, funktioniert alles einwandfrei.
Sobald ich aber die Steuerbefehle über einen anderen Seriellen Monitor oder das C# Programm sende, scheint der Arduino keine (oder Fehlerhafte) Steuerbefehle zu empfangen.

Hier mal mein C# Code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace serialtest
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort arduino = new SerialPort
            {
                PortName = "COM4",
                BaudRate = 115200,
                Parity = Parity.None,
                DataBits = 8,
                StopBits = StopBits.One,
                Handshake = Handshake.None,
                RtsEnable = true,
                DtrEnable = true
            };

            arduino.Open();

            arduino.WriteLine("#b");
            
            arduino.Close();
        }
    }
}

und hier der Arduino Code:

#include <Adafruit_NeoPixel.h>

#define PIN 19
#define PIXELRINGSIZE 24

Adafruit_NeoPixel PixelRing = Adafruit_NeoPixel(PIXELRINGSIZE, PIN, NEO_GRB + NEO_KHZ800);

String inputString = "";        
String inputCommand = "";

void setup() {
  Serial.begin(115200);
  PixelRing.begin();
  PixelRing.setBrightness(50);  // Lower brightness and save eyeballs!
  PixelRing.show(); // Initialize all pixels to 'off'
}

void loop() {
  rainbowCycle(15);
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      inputCommand = inputString.substring(0,inputString.length()-1);
      inputString = "";
      evalSerialData(inputCommand);
    }
  }
}

void evalSerialData(String command)
{
  if (command == "#b") {
        colorWipe(PixelRing.Color(64, 0, 0), 10); // Red
        colorWipe(PixelRing.Color(0,0,0), 10); // Black
  }
  if (command == "#w") {
        colorWipe(PixelRing.Color(64, 64, 0), 100); // Red
        colorWipe(PixelRing.Color(0,0,0), 25); // Black
  }
  else {
  }
}

Hat jemand eine Idee wo mein Fehler liegen könnte?

Danke schon mal!

Hallo,

habe zwar keine Ahnung aber sendet dein C# ein newline am Ende? Darauf wartet dein Arduino Programm.

Es könnte auch sein, dass C# eine andere Meinung über das Zeilenende hat.
Lass Dir auf dem Arduino mal die empfangenen Zeichen als HEX ausgeben.

Wenn Du unerklärliche Abbrüche hast, dann solltest Du die String-Klasse im Arduino durch Char-Arrays (C-strings) ersetzen.

Gruß Tommy

Doc_Arduino:
habe zwar keine Ahnung aber sendet dein C# ein newline am Ende? Darauf wartet dein Arduino Programm.

arduino.WriteLine("#b"); sendet mit \n
arduino.Write("#b"); sendet ohne \n

Das Newline kann man auch genau einstellen:

Auch darauf achten dass du keinen Reset auslöst wenn du die serielle Schnittstelle öffnest

Das Einlesen kann man auch geschickter machen, wenn man das Endzeichen abfragt bevor man das aktuelle Zeichen abspeichert.

Und Objekte übergibt man als Referenz:

void evalSerialData(String& command)

Tommy56:
Es könnte auch sein, dass C# eine andere Meinung über das Zeilenende hat.
Lass Dir auf dem Arduino mal die empfangenen Zeichen als HEX ausgeben.

Gibts dafür ein Tool?

Wenn ich den Seriellen Monitor der Arduino IDE offen habe, um mitzulesen, kann ich mein C# Programm nicht ausführen, weil es keinen Zugriff auf den COM Port bekommt.

Wieso Tool?

Serial.println(inChar,HEX);

Gruß Tommy

Aber wie gesagt. Ich muss den Seriellen Monitor schließen, um das C# Programm ausführen zu können. wenn der Serielle Monitor läuft, bekomm ich im C# Programm einen Fehler, dass COM4 nicht Initialisiert werden kann. Und wenn ich keinen Seriellen Monitor offen habe, bringt mir auch eine Debug Ausgabe nichts, da sie ja nirgends angezeigt wird.

Diese Tatsache bringt mich e schon zum Verzweifeln, weil es das Debugen nicht gerade einfach gestaltet.

Hi

Was hältst Du davon, wenn Dein C#-Programm auch auf serielle Zeichen reagiert?
Dann brauchst Du kein Arduino-Terminal, da Dein Programm Dir die Zeichen ausgibt.
Dabei kann der Arduino die empfangenen Zeichen quasi als BCD-HEX zurück geben.

MfG

Serenifly:
Auch darauf achten dass du keinen Reset auslöst wenn du die serielle Schnittstelle öffnest

Interessanter Ansatz. Woran kann es liegen, das ein Reset ausgelöst wird?

Dann könntest Du mal einen USB-Sniffer versuchen.
Achtung! Bei der Installation keine USB-Tastatur und USB-Maus benutzen., sonst kannst Du die Installation nicht abschließen und er wird bei jedem Boot erfolglos versuchen den Treiber zu installieren.

OT: Weiß jemand, wie man solche Reste unter Win 7 entfernt?

Gruß Tommy

code723:
Interessanter Ansatz. Woran kann es liegen, das ein Reset ausgelöst wird?

DTR

Serenifly:
DTR

DANKE!!!!!!!

Das war der Fehler.