Blink Led über Seriellen Port- Visual Studio 2017 und C#

Grüße

Könnte mir jemand etwas helfen?
Versuche grade mit Visual Studio und C# eine Led Blinken zu lassen.

Das Grundgerüst steht und läuft auch nur jetzt würde ich gern das ganze mit Windows Forms verbinden

Schaff es zwar über die Windows Forms eine Led ein und aus zu schalten aber möchte nun
die delay zeit über Windows Forms steuern.

Wenn ich x den wert 1000 zuweiße klappt alles wunderbar, nun möchte ich aber mit den Windowsforms eine Zahl schicken die meine neue Delay zeit wird also x

wenn ich es über ein serial read versuche bekomm ich -1 zurück ,

Hier der Code für den arduino der auf den Arduino geschickt wird

// Variablen vorbereiten und zuweißen

int rot = 2;  // pin mode 
int x ;

void setup()
{
 Serial.begin(9600);
 pinMode(rot, OUTPUT);
}

void loop()
{
 x = Serial.read();

 digitalWrite(rot, LOW);
 delay(x);
 digitalWrite(rot, HIGH);
 delay(x); 
}

Hier der Code für die Windows Forms :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace blinken
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialPort1.Open();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            serialPort1.Write("250");
        }

        private void mittel_Click(object sender, EventArgs e)
        {
            serialPort1.Write("500");
        }

        private void lang_Click(object sender, EventArgs e)
        {
            serialPort1.Write("1000");
        }
    }
}

Möchte es zuerst mal über fixe Buttons machen, später über eine Eingabeaufforderung um die wartezeit noch besser zu kontrolliern ( im ms bereich zu verändern)

eventuell hat hier jemand eine Info dazu?

Im Anhang die Beiden Codes nochmals und das Windows Form

Unbenannt.png

Wo wird die Baudrate (9600) vereinbart?

Du scheinst dir keine Gedanken gemacht zu haben was du da eigentlich an Daten verschickst

read() liest ein Byte ein. Das ist alles. Auf dem PC schickst du dann einen String. Das wird natürlich nichts. Und auch kein Endzeichen um das Ende der Übertragung zu erkennen.

Normal schickt mal da ein LF oder CR/LF als Ende-Erkennung. Und dann liest man Byte für Byte ein und bastelt den String zusammen bis das LF eintrifft. Dann konvertiert man den String in einen Integer

C# und Arduino
Da fällt mir immer zuerst der "CmdMessenger" ein.

Der hat einen Flansch zu Arduino und zu C#, zum Zwecke der Datenübertragung.

agmue:
Wo wird die Baudrate (9600) vereinbart?

danke dachte die Baudrate ist standard 9600 ? wie definier ich das bzw wie vereinbar ich dieses ?

Serenifly:
Du scheinst dir keine Gedanken gemacht zu haben was du da eigentlich an Daten verschickst

read() liest ein Byte ein. Das ist alles. Auf dem PC schickst du dann einen String. Das wird natürlich nichts. Und auch kein Endzeichen um das Ende der Übertragung zu erkennen.

Normal schickt mal da ein LF oder CR/LF als Ende-Erkennung. Und dann liest man Byte für Byte ein und bastelt den String zusammen bis das LF eintrifft. Dann konvertiert man den String in einen Integer

nein nicht ganz da ich dachte er würde mehrere Zeichen schicken als nur 1 Byte , wie konvertier ich den String im arduino sketch?

durchdacht habe ich das ein wenig anders da in der Konsole von visual studio sich die eingabeaufforderung wunderbar in die Int variable ( je nach verwendung) konvertiern lässt - int x = Convert.toInt32(readline());

Bin eben auch davon ausgegangen das sich die übertragung über den seriellen Port auch so realisiern lässt ...

wie geh ich da nun vor? müsste ich für jede zahl die ich eingebe eine eigene variable erstellen und ein eigenes digitalWrite ?

gibts dazu eine Anleitung?

danke für die ersten Infos , die haben bisher schon mal ein stück geholfen :wink: zu verstehn wie man es nicht macht =D

combie:

C# und Arduino
Da fällt mir immer zuerst der "CmdMessenger" ein.

Der hat einen Flansch zu Arduino und zu C#, zum Zwecke der Datenübertragung.

über die CMD - Konsole wusste ich bisher nicht wie ich den arduino anspreche bzw die Serielle Verbindung herstelle

lg max dankeschön

const int SERIAL_BUFFER_SIZE = 16;

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

void loop()
{
  char* str = readSerial(Serial);
  if (str != NULL)
  {
    Serial.print("Empfangen: "); Serial.println(str);

    switch (str[0])
    {
      case 'a':
      case 'A':
        {
          unsigned int value = atoi(str + 1);
          Serial.print("Konvertiert: "); Serial.println(value);
          Serial.println();
        }
        break;
      case 'b':
      case 'B':
        {
          unsigned int value1 = atoi(strtok(str + 1, ","));
          int value2 = atoi(strtok(NULL, ","));
          Serial.print("Konvertiert: "); Serial.print(value1); Serial.print(" und "); Serial.println(value2);
          Serial.println();
        }
        break;
    }
  }
}

char* readSerial(Stream& stream)
{
  static byte index;
  static char serialBuffer[SERIAL_BUFFER_SIZE];

  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n' && index > 0)       //wenn LF eingelesen und String länger als 0 ist
    {
      serialBuffer[index] = '\0';     //String terminieren
      index = 0;
      return serialBuffer; //melden dass String fertig eingelesen wurde
    }
    else if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)   //solange noch Platz im Puffer ist
    {
      serialBuffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
    }
  }

  return NULL;        //noch nicht fertig
}

Das Programm kennt zwei Kommandos:

A[nummer]
B[nummer,nummer]

also z.B:

A105
B3,1000

Leerzeichen sind auch erlaubt

Nur um zu zeigen wie man auch mehrere Zahlen unterscheiden und auswerten kann. z.B. Pin Nummer + Zeit

Die Zahlen werden einfach konvertiert und direkt wieder zurück geschickt. Es wird nichts geblinkt

Wenn du keinen Buchstaben hast um Kommandos zu unterscheiden musst du natürlich das +1 weglassen. Das ist dazu da damit bei der Konvertierung mit dem Zeichen danach anfängt

Auf dem PC 9600 Baud einstellen. Und LF oder CR+LF als Endzeichen. CR + LF sollte schon Standard sein wenn man ein SerialPort Objekt erzeugt

Bei dem Programm sei angemerkt, dass man readSerial() solange aufrufen muss bis das Endzeichen da ist. Nicht von der while Schleife verwirren lassen. Die serielle Kommunikation ist so langsam (1 / Baudrate / 10 Sekunden pro Zeichen) dass i.d.R. immer nur ein Zeichen im Eingangspuffer ist

In der C# Anwendung musst du dann WriteLine() statt Write() verwenden. Das schickt automatisch das NewLine Property hinten dann.

Was da noch fehlt sind so Dinge wie Baudrate, Portname (z.B. “COM1” oder “COM3”) und das Datenformat (Start- und Stopbits)…
Ein SerialPort Objekt erzeugt man normal eher so:

serialPort = new SerialPort(comPort, baudRate, Parity.None, 8, StopBits.One);

Du hast wahrscheinlich einen SerialPort als GUI Objekt. Das ist weniger gut. Besser man macht es komplett per Hand. Aber du kannst diese Dinge auch nachträglich verändern

Für den Com Port kann mit GetPortNames() ein String Array der Namen bekommen und das z.B. in eine ListBox eintragen. Man kann ihn mit Zugriff auf die Windows API auch automatisch herausfinden, aber das wird für dich zu kompliziert sein

Hallo,

kannst Dir auch noch mal das Beispiel in der IDE ansehen

Datei /Beispiele/Communication/ReadAsciiString

Heinz

über die CMD - Konsole wusste ich bisher nicht

Das könnte ich dir auch zeigen…

War aber nicht gemeint!
Siehe: CmdMessenger

danke für die vielen Anregungen
bin noch recht neu in der Programmierung, aber langsam wirds was ^^

werde das mal schritt für schritt durchgehen, danke vorerst =D