Serielle Schnittstelle zwischen Arduino und C#-Programm

Hallo zusammen
ich habe ein kleines Problem, ich hab mein Arduino Board dass Frequenzen misst und Ausgibt. Die gemessenen Werte werden an ein C# Programm ausgegeben, soweit funktioniert alles, jedoch möchte ich mein Arduino von dem C# aus starten können, dies ist mir jedoch leider noch nicht gelungen. Ich habe dafür den Startbutton der das ganze Arduino Programm "aktivieren" soll. Kann mir jemand helfen?

C# kommt in einem weiteren Post, habe sonst keinen Platz(PS: hat jemand der dass kann geschrieben)

und hier mein Arduino Code

#include <DueTimer.h>
#define oneHzSample 1000000// sample for the 1Hz signal expressed in microseconds

int AnzahlMesswert = 0;

char Frequenz = 'A';

int KTyp = 0;

const int TESTPIN = 43;

//---Frequenz mit Pushbutton aendern-----------------------------------------------------------------------------
int FrequenzFertig = 0;

//---Sinuskurve--------------------------------------------------------------------------------------------------
int count = 0;
int Array[] = {2048, 2254, 2455, 2646, 2822, 2979, 3113, 3221, 3300, 3348, 3365, 3348, 3300, 3221,
3113, 2979, 2822, 2646, 2455, 2254, 2048, 1842, 1641, 1450, 1274, 1117, 983, 875,
796, 748, 731, 748, 796, 875, 983, 1117, 1274, 1450, 1641, 1842};

//---Verstärkung-------------------------------------------------------------------------------------------------
int varVer = 0;
const int PINVer = 8;

//---Messwert----------------------------------------------------------------------------------------------------
const int MessungMic1 = A0;
const int MessungMic2 = A1;
float MessMic1 = 0;
float MessMic2 = 0;
float MesswertDurch1 = 0;
float MesswertDurch2 = 0;

//---VoidSetup---------------------------------------------------------------------------------------------------
void setup() {
analogWriteResolution(12); // Analoger Ausgang auf 12Bit gestellt (4096 levels)
analogReadResolution(12); // Analoger Eingang auf 12Bit gestellt (4069 levels)

Serial.begin(9600);

pinMode(PINVer, OUTPUT);

pinMode(TESTPIN, OUTPUT);

}
//---Hauptprogramm-----------------------------------------------------------------------------------------------
void loop() {

if(Serial.available()>0)
{
byte incommingbyte = Serial.read();
if(incommingbyte >= 1)
{
digitalWrite(TESTPIN, HIGH);
}
}

MesswertDurch1 = 0;
MesswertDurch2 = 0;

switch(Frequenz){
case 'A':
Timer5.attachInterrupt(wave).start(50);
delay(1000);
Messung();
writing();
Frequenz = 'B';
break;
case 'B':
Timer5.attachInterrupt(wave).start(25);
delay(1000);
Messung();
writing();
Frequenz = 'C';
break;
case 'C':
Timer5.attachInterrupt(wave).start(10);
delay(1000);
Messung();
writing();
Frequenz = 'D';
break;
case 'D':
Timer5.attachInterrupt(wave).start(5);
delay(1000);
Messung();
writing();
FrequenzFertig = FrequenzFertig + 1;
if(FrequenzFertig == 1){
varVer = 1;
verstaerkung();
Frequenz = 'A';
}
break;
default:
break;
}
if(FrequenzFertig == 2){
varVer = 0;
verstaerkung();
Frequenz = 'X';
}
}

//---Messung--------------------------------------------------------------------------------------------------------
void Messung(){
//if(Lietrplattentyp == 2){
do{
Messwert1();
Messwert2();
delay(50);
AnzahlMesswert = AnzahlMesswert + 1;
} while(AnzahlMesswert < 10);
AnzahlMesswert = 0;
//}

/if(Lietrplattentyp == 1){
do{
Messwert1();
delay(50);
AnzahlMesswert = AnzahlMesswert + 1;
} while(AnzahlMesswert < 10);
AnzahlMesswert = 0;
}
/

}

//---Sinus Kurve Ausgabe--------------------------------------------------------------------------------------------
void wave(){
analogWrite(DAC0, Array[count]);
count++;
if(count == 40){
count = 0;
//delayMicroseconds(20);
}
}

//---Vertärkungsumstellung V2 / V400--------------------------------------------------------------------------------
void verstaerkung(){
if(varVer == 0){
digitalWrite(PINVer, LOW);
}
else if(varVer == 1){
digitalWrite(PINVer, HIGH);
}

}

//---Wert analog von Messung 1 einlesen-----------------------------------------------------------------------------------
void Messwert1(){
MessMic1 = analogRead(MessungMic1);
MessMic1 = MessMic1 / 1241;
MesswertDurch1 = MesswertDurch1 + MessMic1;
}

//---Wert analog von Messung 2 einlesen-----------------------------------------------------------------------------------
void Messwert2(){
MessMic2 = analogRead(MessungMic2);
MessMic2 = MessMic2 / 1241;
MesswertDurch2 = MesswertDurch2 + MessMic2;
}

//---Schreiben-----------------------------------------------------------------------------------
void writing(){
MesswertDurch1 = MesswertDurch1 / 10;
MesswertDurch2 = MesswertDurch2 / 10;

Serial.println(String(KTyp)+String(Frequenz)+String(varVer)+String(MesswertDurch1)+String(MesswertDurch2));
}

Ich danke euch schon im voraus
mfg swarley_swarley

hier der C#

using System;
using System.Threading;
using System.IO.Ports;
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 Microsoft.VisualBasic;
using System.Runtime.InteropServices;

namespace LP_Testgeraet_Aladin
{
public partial class LP_Testgeraet : Form
{
private byte LP_Typ = 0;
private string SN_PCB = "";
private string Artikelnummer = "";
private bool Test_Status = false;

public LP_Testgeraet()
{
InitializeComponent();
}

private string eingeben_Geraete_Serienummer()
{
string Geraete_SN = "";
Geraete_SN = Interaction.InputBox("Typ und Serienummer des Gerätes eingeben:", "Serienummer");
if (Geraete_SN == "")
{
Geraete_SN = "Keine SN eingegeben";
}
Lb_Serienummer.Text = Geraete_SN;
Artikelnummer = Geraete_SN.Substring(0, 6);
Lb_Leiterplatte_Typ.Text = Artikelnummer;
return Geraete_SN;
}

private void initializePorts()
{
cB_Ports.Items.Clear();
foreach (string s in System.IO.Ports.SerialPort.GetPortNames())
cB_Ports.Items.Add(s);
int a = cB_Ports.Items.Count;
cB_Ports.SelectedIndex = a - 1;

bT_Suche_Port.Enabled = true;
}

private void bT_Suche_Port_Click(object sender, EventArgs e)
{
bT_Suche_Port.Enabled = false;
initializePorts();
}

private void cB_Ports_SelectedIndexChanged(object sender, EventArgs e)
{
Lb_COMPort.Text = "Serial Port: " + cB_Ports.Text;
}

private void bT_Connect_Click(object sender, EventArgs e)
{
cB_Ports.Enabled = false;
bT_Connect.Enabled = false;
bT_Suche_Port.Enabled = false;
SerialPort_Arduino.PortName = cB_Ports.Text;
SerialPort_Arduino.WriteTimeout = 500;
SerialPort_Arduino.ReadTimeout = 500;
SerialPort_Arduino.Open();
Lb_COMPort.Text = "Arduino ist mit Port " + cB_Ports.Text + "verbunden";
Thread.Sleep(500);
}

private void bT_Disconnect_Click(object sender, EventArgs e)
{
SerialPort_Arduino.Close();
cB_Ports.Enabled = true;
bT_Connect.Enabled = true;
bT_Suche_Port.Enabled = true;
}

private void Befehl_senden(byte Commando, byte LP_Typ)
{
byte[] TxBuffer = new byte[4];
TxBuffer[0] = 85; // Startzeichen
TxBuffer[1] = Commando;
TxBuffer[2] = LP_Typ;
TxBuffer[3] = 170; // Schlusszeichen
SerialPort_Arduino.Write(TxBuffer, 0, 4);
}

jedoch möchte ich mein Arduino von dem C# aus starten können

Der Arduino startet, wenn er Strom kriegt.

Er kann dann ja beliebig lange auf ein erstes Kommando auf der Seriellen Schnittstelle warten.
Das kannst du sogar in setup() packen.

void setup() {
   analogWriteResolution(12);  // Analoger Ausgang auf 12Bit gestellt (4096 levels)
   analogReadResolution(12);   // Analoger Eingang auf 12Bit gestellt (4069 levels)

   Serial.begin(9600);
  
   pinMode(PINVer, OUTPUT);
   pinMode(TESTPIN, OUTPUT);
   while (Serial.available() == 0) { /* warte bis was vom PC kommt */ }
   digitalWrite(TESTPIN, HIGH);
}

Bzw. um die Übertragung aktivieren und deaktivieren zu können, würde ich Deinen Loop so anpassen:

//---Hauptprogramm-----------------------------------------------------------------------------------------------
bool activated = FALSE;
void loop() {

 if(Serial.available()>0)
 {
   byte incommingbyte = Serial.read();
   if(incommingbyte >= 1)
   {
     digitalWrite(TESTPIN, HIGH);
     activated = incommingbyte == X;
   }
 }
 if(!activated)
   return;
}

Anstelle von X kannst Du nun ein Zeichen hinterlegen, welches den weiteren Code "aktiviert" oder rausspringt, bis das .Net-Programm wieder ein Zeichen übermittelt.

michael_x Lösung im Setup() funktioniert nur einmalig.
Beides startet den Ardu aber nicht, sondern beginnt lediglich mit der Übertragung.

Danke vielmals, Funktioniert jetzt alles wie es sollte

:slight_smile: