Mit c# Programm auf Arduino Leonardo zugreifen

Hallo,

Ich bin mal wieder am verzweifeln. Ich schreibe mit meinem Arduino Daten (erstmal nur Testdaten) an die Serielle Schnittstelle um sie mit einem c# (.Net 8.0) am Rechner entgegen zu nehmen.
Der Serielle Port wird am Rechner zwar geöffnet aber es gelingt mir nicht die Daten zu empfangen. Vielleicht hat ja jemand damit schon Erfahrungen gemacht.

Hier das Sketch auf dem Arduino:

void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  int rnd = random(1,7);

  if(Serial)
  {
    Serial.print("Millis=");
    Serial.print(millis());
    Serial.print(";Random=");
    Serial.println(rnd);
  }
}

Und hier das c# Programm auf PC Seite:

public partial class Form1 : Form
{
    SerialPort serialPort;

    public Form1()
    {
        InitializeComponent();

        foreach (string s in SerialPort.GetPortNames())
        {
            comboBoxSerialPorts.Items.Add(s);
        }
    }

    private void comboBoxSerialPorts_SelectedIndexChanged(object sender, EventArgs e)
    {
        string name = (string)comboBoxSerialPorts.SelectedItem;
        if (name != null && name.ToLower().StartsWith("com"))
        {
            try
            {
                serialPort = new SerialPort(name, 9600, Parity.None, 8, StopBits.One);
                serialPort.Handshake = Handshake.None;
                serialPort.Open();
                if (serialPort.IsOpen)
                {
                    labelStatusSerial.BackColor = Color.Green;
                    labelStatusSerial.Text = "Verbunden";
                    backgroundWorker.RunWorkerAsync();
                }
                else
                {
                    throw new Exception("Can't connect to " + name);
                }
            }
            catch (Exception ex)
            {
                labelStatusSerial.BackColor = Color.Red;
                labelStatusSerial.Text = "Nicht Verbunden";
            }
        }
    }

    private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        try
        {
            while (serialPort != null && serialPort.IsOpen)
            {
                // Hier sollten jetzt die Daten ankommen
                string indata = serialPort.ReadExisting();
                if (indata != null && indata.Length > 0)
                {
                    backgroundWorker.ReportProgress(50, indata);
                }
                Thread.Sleep(1);
            }
        }
        catch (Exception ex)
        {
            
        }
        backgroundWorker.ReportProgress(100);
    }

    private void backgroundWorker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        richTextBox1.AppendText("DataReceived: " + ((string)e.UserState) + "\n");
    }

    private void backgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
    {
        try
        {
            serialPort.Close();
        }
        catch (Exception ex)
        {
        }
        serialPort = null;
        labelStatusSerial.BackColor = Color.Red;
        labelStatusSerial.Text = "Nicht Verbunden";
    }
}

Hallo jacoblange

Da fehlt in der setup() Funktion ein Serial.begin(baudrate).

...und der Arduino würde den PC auch ganz schön zuballern.
Vielleicht für den Anfang erstmal nur alle 10s (oder so) etwas senden?

Sorry, das Serial.begin(9600) ist vorhanden, ich hatte das Testscript nur nicht gespeichert und beim Eingeben hier im Forum dann vergessen.

Ja, aber die Arduino IDE kommt ja auch damit klar. Wenn ich die IDE Starte, dann kommen auch sofort die Ausgaben im Serial Monitor.
Im dem c# Programm habe ich auch nochmal geguckt, ist auch der Empfangs Buffer leer.

serialPort.BytesToRead liefert 0

Und falls jemand fragt, wenn ich mein c# Programm teste ist die Arduino IDE natürlich geschlossen, sonst kann der Serielle Port gar nicht geöffnet werden.

Der CMDmessenger tut C# zu Arduino Kommunikation.
Vielleicht kannst du dir da was abschauen.

Tausend Dank für den Rat, jetzt funktioniert es.

Ich habe die Initialisierung jetzt wie folgt abgeändert:

serialPort = new SerialPort(name, 9600, Parity.None, 8, StopBits.One)
{
    DtrEnable = true,
    WriteTimeout = 1000,
    ReadTimeout  = 1000, // read timeout is used for polling in worker thread
};
serialPort.Open();
serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.