Frage zur seriellen Datenübertgung aus VB

Yippi :wink:

So klappts:

#define NUMBER_OF_FIELDS 20
int values[NUMBER_OF_FIELDS];
byte fieldIndex;

void loop()
{
  if ( Serial.available())
  {
    char ch = Serial.read();
    Serial.print(ch, HEX);
    Serial.print('\t');
    Serial.println(fieldIndex);
    if (ch >= '0' && ch <= '9') // ASCII-Zeichen zwischen 0 und 9?
    {
      if (fieldIndex < NUMBER_OF_FIELDS) {
        values[fieldIndex] = (values[fieldIndex] * 10) + (ch - '0');
      }
    }
    else if (ch == ',')
    {
      fieldIndex++;
    }
    else if (ch == '\n')
    {

for (int i = 1; i <= values[0] ; i++)
      {
        digitalWrite (2, HIGH);
        delay(200);
        digitalWrite(2, LOW);
        delay(200);
      }


for (int i = 1; i <= values[1] ; i++)
      {
        digitalWrite (3, HIGH);
        delay(200);
        digitalWrite(3, LOW);
        delay(200);
      }



      
      for (int i = 0; i < min(NUMBER_OF_FIELDS, fieldIndex + 1); i++)
      {
        Serial.print(values[i], DEC);
        Serial.print(" ");
        values[i] = 0; // loeschen
      }
      fieldIndex = 0; // für Neustart
      Serial.println();
    }

  }
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode (2, OUTPUT);
  pinMode (3, OUTPUT);
}

Sehr schön! Vielen lieben Dank!

Ein noch: wie kann man es nun noch realisieren, dass das Blinken der beiden Ausgänge Pin2 und Pin3 gleichzeitig geschieht?

photojo:
Ein noch: wie kann man es nun noch realisieren, dass das Blinken der beiden Ausgänge Pin2 und Pin3 gleichzeitig geschieht?

Einfach delay() vergessen!

#define ledPin1 2
#define ledPin2 3
#define NUMBER_OF_FIELDS 20
char values[NUMBER_OF_FIELDS];
byte fieldIndex;
uint16_t blinkZaehler1, blinkZaehler2;
const uint32_t blnkIntervall1 = 200, blnkIntervall2 = 200;
uint32_t aktMillis, blinkMillis1, blinkMillis2;

void loop()
{
  aktMillis = millis();
  if ( Serial.available())
  {
    char ch = Serial.read();
    Serial.print(ch, HEX);
    Serial.print('\t');
    Serial.println(fieldIndex);
    if (ch >= '0' && ch <= '9') // ASCII-Zeichen zwischen 0 und 9?
    {
      if (fieldIndex < NUMBER_OF_FIELDS) {
        values[fieldIndex] = (values[fieldIndex] * 10) + (ch - '0');
      }
    }
    else if (ch == ',')
    {
      fieldIndex++;
    }
    else if (ch == '\n')
    {
      if (fieldIndex >= 1) {
        blinkZaehler1 = values[0] * 2;
        blinkZaehler2 = values[1] * 2;
      }
      for (int i = 0; i < min(NUMBER_OF_FIELDS, fieldIndex + 1); i++)
      {
        Serial.print(values[i], DEC);
        Serial.print(" ");
        values[i] = 0; // loeschen
      }
      fieldIndex = 0; // für Neustart
      Serial.println();
    }
  }

  if ((blinkZaehler1 > 0) && (aktMillis - blinkMillis1 >= blnkIntervall1)) {
    blinkMillis1 = aktMillis;
    digitalWrite(ledPin1, !digitalRead(ledPin1));
    blinkZaehler1--;
  }
  if ((blinkZaehler2 > 0) && (aktMillis - blinkMillis2 >= blnkIntervall2)) {
    blinkMillis2 = aktMillis;
    digitalWrite(ledPin2, !digitalRead(ledPin2));
    blinkZaehler2--;
  }
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}

Sorry, ich möchte nicht unhöflich oder unverschämt erscheinen, aber kannst dir bitte nochmal diesen Code, der im prinzip ja dein gestriger, erster war, ansehen und mir sagen, wie bei diesem das Blinken der LEDs gleichzeitig realisieren kann?

#define NUMBER_OF_FIELDS 20
int values[NUMBER_OF_FIELDS];
byte fieldIndex;

void loop()
{
  if ( Serial.available())
  {
    char ch = Serial.read();
    Serial.print(ch, HEX);
    Serial.print('\t');
    Serial.println(fieldIndex);
    if (ch >= '0' && ch <= '9') // ASCII-Zeichen zwischen 0 und 9?
    {
      if (fieldIndex < NUMBER_OF_FIELDS) {
        values[fieldIndex] = (values[fieldIndex] * 10) + (ch - '0');
      }
    }
    else if (ch == ',')
    {
      fieldIndex++;
    }
    else if (ch == '\n')
    {

for (int i = 1; i <= values[0] ; i++)
      {
        digitalWrite (2, HIGH);
        delay(200);
        digitalWrite(2, LOW);
        delay(200);
      }


for (int i = 1; i <= values[1] ; i++)
      {
        digitalWrite (3, HIGH);
        delay(200);
        digitalWrite(3, LOW);
        delay(200);
      }



     
      for (int i = 0; i < min(NUMBER_OF_FIELDS, fieldIndex + 1); i++)
      {
        Serial.print(values[i], DEC);
        Serial.print(" ");
        values[i] = 0; // loeschen
      }
      fieldIndex = 0; // für Neustart
      Serial.println();
    }

  }
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode (2, OUTPUT);
  pinMode (3, OUTPUT);
}

Jetzt habe ich den Faden verloren :confused:

agmue: Jetzt habe ich den Faden verloren :confused:

Das ist auch kein Wunder.

Der TO sollte einfach mal lesen und lernen, was er da kopiert. Ohne die Grundlagen zu lernen, wird er es nicht verstehen.

Leider versteht er ja die einfachsten Dinge nicht, da ist es auch schwer ihm etwas zu erklären.

Danke nochmal an alle. Ich habe das Problem erstmal gelöst.

photojo: Danke nochmal an alle. Ich habe das Problem erstmal gelöst.

Das freut uns alle. Allerdings gehört in diesem Forum auch dazu, dass du deine Lösung hier präsentierst. Das hilft dann auch anderen, die dir geholfen haben.

Klar poste ich den Code. Musste eben nur schnell weg.

#define NUMBER_OF_FIELDS 5
int values[NUMBER_OF_FIELDS];
byte fieldIndex;
void setup()
{
  Serial.begin(9600);
  //Serial.println("Anfang");
  pinMode (2, OUTPUT);
  pinMode (3, OUTPUT);
  pinMode (4, OUTPUT);
}
void loop()
{
  Serial.println("verbunden");
  if ( Serial.available())
  {
    char ch = Serial.read();
    Serial.print(ch, HEX);
    Serial.print('\t');
    Serial.println(fieldIndex);
    if (ch >= '0' && ch <= '9') // ASCII-Zeichen zwischen 0 und 9?
    {
      if (fieldIndex < NUMBER_OF_FIELDS) {
        values[fieldIndex] = (values[fieldIndex] * 10) + (ch - '0');
      }
    }
    else if (ch == ',')
    {
      fieldIndex++;
    }
    else if (ch == '\n')
    {
      {
        delay (values[0]); // Verzögerung vor Öffnung 1
        digitalWrite (2, HIGH); // Ventil_1 auf
        delay (values[2]);  // offen
        digitalWrite(2, LOW); // zu
        delay (values[1]); // warte
        digitalWrite (2, HIGH); // auf
        delay (values[2]); // offen
        digitalWrite(2, LOW); // zu
        // Kamera verzögert auslösen
        delay (values[4]);
        digitalWrite(3, HIGH);
        delay (50);
        digitalWrite(3, LOW);
      }
     for (int i = 0; i < min(NUMBER_OF_FIELDS, fieldIndex + 1); i++)
      {
        Serial.print(values[i], DEC);
        Serial.print(" ");
        values[i] = 0; // loeschen
      }
      fieldIndex = 0; // für Neustart
      Serial.println();
    }

  }
}

Der Code öffnet wie kommentiert ein Ventil 2-mal kurz und löst dann eine Kamera aus.

[Leider kann dieser Code ein zweites, drittes, … Ventil nicht parallel zum Ventil 1 ansteuern, da fehlen mir, wie oben von einem User zu lesen ist, die Grundlagen. Dennoch habe ich es meinen bescheidenen Kenntnissen geschaft, mit VB, was ich vor drei Tagen auch noch nocht kannte, den Arduino per GUI anzusteuern!
Auch den teile ich gerne …

Public Class Form1
Dim t As Integer 'delta +/- für Tropfengröße = Öffnungsdauer Ventil
Dim delta As Integer
Dim values As String
Dim values_display As String

Dim a As Integer
'Private WithEvents objSerials As New System.IO.Ports.SerialPort("COM3")

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	txt_delta.Text = 5
	t = 2
	txt_v1_start_T1.Text = 1000
	txt_v1_start_T2.Text = 120
	txt_v1_groesseT.Text = 60
	txt_verz_cam.Text = 500
	
	Dim iI As Integer
'For i = 0 To My.Computer.Ports.SerialPortNames.Count - 1
'    ListBox1.Items.Add(My.Computer.Ports.SerialPortNames(i))
'Next
	
	
	For iI = 0 To My.Computer.Ports.SerialPortNames.Count - 1
		ComboBox1.Items.Add(My.Computer.Ports.SerialPortNames(iI))
	Next
	
	ComboBox1.SelectedIndex = 3
	
	
	
	connect.Text = "getrennt"
	connect.ForeColor = Color.Red
	
	
	
End Sub


' VENTIL 1 - Verzögerung für ÖFFNUNG 1 up/down
Private Sub btn_v1_verz_T1_up_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_v1_verz_T1_up.Click
	txt_v1_start_T1.Text = txt_v1_start_T1.Text + delta
End Sub

Private Sub btn_v1_verz_T1_down_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_v1_verz_T1_down.Click
'delta = txt_delta.Text
	txt_v1_start_T1.Text = txt_v1_start_T1.Text - delta
'i = i - delta
	
End Sub

' VENTIL 1 - Verzögerung für ÖFFNUNG 2 up/down
Private Sub btn_v1_verz_T2_up_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_v1_verz_T2_up.Click
	txt_v1_start_T2.Text = txt_v1_start_T2.Text + delta
End Sub

Private Sub btn_v1_verz_T2_down_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_v1_verz_T2_down.Click
	txt_v1_start_T2.Text = txt_v1_start_T2.Text - delta
End Sub
' ---------------------------------------------

' delta für ms
Private Sub txt_delta_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_delta.TextChanged
	delta = txt_delta.Text
End Sub

' VENTIL 1 - TROPFENGRÖSSE
Private Sub btn_v1_tropfengroesse_up_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_v1_tropfengroesse_up.Click
	txt_v1_groesseT.Text = txt_v1_groesseT.Text + t
End Sub

Private Sub btn_v1_tropfengroesse_down_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_v1_tropfengroesse_down.Click
	txt_v1_groesseT.Text = txt_v1_groesseT.Text - t
End Sub
' ----------------------------------------------

Private Sub btn_verz_cam_up_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_verz_cam_up.Click
	txt_verz_cam.Text = txt_verz_cam.Text + delta
End Sub

Private Sub btn_verz_cam_down_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_verz_cam_down.Click
	txt_verz_cam.Text = txt_verz_cam.Text - delta
End Sub


Private Sub werte_senden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles werte_senden.Click
	values_display = txt_v1_start_T1.Text & "," & txt_v1_start_T2.Text & "," & txt_v1_groesseT.Text & "," & txt_verz_cam.Text
	values = values_display & "," & vbCrLf
	ausgabe_values.Text = values_display
'System.Threading.Thread.Sleep(100)
	Console.WriteLine("We're going to divide 10 by 0 and see what happens...")
	If SerialPort1.IsOpen = True Then
		SerialPort1.Write(values)
		
		SerialPort1.DiscardInBuffer()    ' Zum löschen des Eingangspuffers
		SerialPort1.DiscardOutBuffer()    ' Zum löschen des Ausgangspuffers
		
'System.Threading.Thread.Sleep(100)
'SerialPort1.Close()
	End If
	
End Sub




Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles serial_connect.Click
	If SerialPort1.IsOpen = False Then
		With SerialPort1
'.PortName = ComboBox1.SelectedItem.ToString()
			.PortName = "COM3"
			.BaudRate = 9600
			.DataBits = 8
			.Parity = IO.Ports.Parity.None
			.StopBits = IO.Ports.StopBits.One
			.Handshake = IO.Ports.Handshake.None
		End With
		Try
		SerialPort1.Open()
'connect.Text = "verbunden"
		
		Catch ex As Exception
		MessageBox.Show(ex.ToString)
		End Try
	End If
	
	
	
	
End Sub

Private Sub serial_disconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles serial_disconnect.Click, ComboBox1.Click
	If SerialPort1.IsOpen = True Then
		SerialPort1.Close()
	End If
	
	If SerialPort1.IsOpen = False Then
		connect.Text = "getrennt"
		connect.ForeColor = Color.Red
	End If
	
End Sub



Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
	Me.Invoke(Sub() ReceivedText(SerialPort1.ReadExisting()))
End Sub
Private Sub ReceivedText(ByVal [text] As String)
	connect.Text = ("verbunden mit Arduino")
	connect.ForeColor = Color.Green
End Sub

Private Sub btn_start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
	If SerialPort1.IsOpen = True Then
		SerialPort1.Write("A")
	End If
End Sub

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'If MsgBox("schließen ja nein", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
	Me.Close()
'Else
'End If
End Sub
End Class

]