aide communication série entre Arduino et visual c#

Bonjour, désolé de ne pas avoir répondu plus tôt

Donc je vous post mon code Arduino qui fonctionne pour la lecture de l'entrée analogique et le code visual c# associé

Ensuite je vous posterai (dans un autre post pour eviter toutes confusion ce que j'ai essayé de faire pour commander le moteur mais qui ne marche pas :slight_smile:

Donc voici mon code Arduino :

void setup()  
{                

  Serial.begin(19254 );  
}

void loop()                    
{
  if(Serial.available())
  {
    int c = Serial.read();
    
    if (c == '4')
    {
    Serial.println(analogRead(A1));
    }  
  }
}

et le code visual c#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using Microsoft.Office.Core;
using Excel = Microsoft.Office.Interop.Excel;
using System.Windows.Forms.DataVisualization.Charting;
using Microsoft.Office.Interop.Excel;
using ApplicationForm = System.Windows.Forms.Application;
using System.Globalization;

namespace Acqu_donnee
{
    public partial class Form1 : Form
    {
        SerialPort Port1; //ouverture du port série

        public Form1()
        {
            InitializeComponent();
            for (int i = 1; i <= 50; i++)
            {
                try
                {
                    Port1 = new SerialPort("COM" + i, 19254); //Port1 trouve le port COM du PC
                    Port1.Open(); //Port1 est ouvert
                    Port1.ReadTimeout = 1000; //Delais pour l'écriture
                    Port1.WriteTimeout = 1000; //Délais pour la lecture

                    Port1.Write("4"); //Ecrit 4 sur le port 1

                    byte[] lus = new byte[8]; 
                    int nblu = Port1.Read(lus, 0, 8); 
                    if (nblu > 0)
                    {
                        return; // port trouvé
                    }
                }
                catch (Exception)
                {
                    Port1.Dispose();
                }

            }
        }

        public void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (Port1.IsOpen) Port1.Close(); //Ferme le port1 à la fermeture du programme
        }

        public void timer1_Tick(object sender, EventArgs e) //Evenement à chaque tick du Timer1
        {
            string r = ""; //défini r comme un string vide
            double x = 0; //défini x comme un double vide
            double value = 0; //Défini vélue comme un double vide
            if (Lect_mes.Checked) //Si Lect_mes est cochée
            {
                Port1.Write("4"); //on écrit 4 sur le port1
            }
            
            r = Port1.ReadLine(); //r = ce qu'il lit sur le port1
            try 
            {
                x = Convert.ToDouble(r); //converti un Char en Double
                value = Math.Round((x / 1024 * 5 * 2 * 196.2), 2); //On calcul la pression
                //1024 = 0...1023 échantillons (valeur renvoyée par le port1)
                //5 car on est sur la plage 0...5V
                //196.2 convertion Kg en Newton
                //2, on arrondis à 2 décimales
            }
            catch 
            {
                if (listBox1.Items.Count == 0)
                {
                    value = 0;
                }
                else
                {
                    value = double.Parse( listBox1.Items[listBox1.Items.Count - 1].ToString());
                }
            }
            listBox1.Items.Add(value); //Ajoute les valeurs de value dans la ListBox
            listBox1.SelectedIndex = listBox1.Items.Count - 1; //AutoScroll de la ListBox

            double xVal = listBox1.Items.Count * 0.02; //Valeur axe des x
            chart1.Series[0].Points.AddXY(xVal, value); //Ecriture des points sur le graph
            chart1.ChartAreas[0].AxisX.Maximum = xVal; // Maximum de l'axe des x est la dernière valeur de XVal
            if (chart1.Series[0].Points.Count > 250) // Permet d'afficher que 5 secondes sur l'axe des x
            {
                chart1.Series[0].Points.RemoveAt(0);
            }
            
           chart1.ChartAreas[0].AxisX.Minimum = chart1.Series[0].Points[0].XValue;
              
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            string r = ""; //défini r comme un string vide
            double x = 0; //défini x comme un double vide
            double value = 0; //Défini vélue comme un double vide
            if (Lect_mes.Checked) //Si Lect_mes est cochée
            {
                Port1.Write("4"); //on écrit 4 sur le port1
            }

            r = Port1.ReadLine();
            try 
            {
                x = Convert.ToDouble(r); //converti un Char en Double
                value = Math.Round((x / 1023 * 5 * 2 * 196.2), 2); //On calcul la pression
                //1024 = 0...1023 échantillons (valeur renvoyée par le port1)
                //5 car on est sur la plage 0...5V
                //196.2 convertion Kg en Newton
                //2, on arrondis à 2 décimales
            }
            catch 
            {
                value = 0;
            }
            textBox1.Text = value.ToString() +' ' + 'N'; // Rajoute N après la mesure dans la TextBox
        }

        public void Lect_mes_CheckedChanged(object sender, EventArgs e) //Evenement quand Lect_mes change d'état
        {
            if (Lect_mes.Checked) //Si Lect-mes est coché on écrit 4 sur le Port1
            {                     //et on actionne les Timers
                Port1.Write("4");
                timer1.Enabled = true;
                timer2.Enabled = true;
            }
            else
            {
                timer1.Enabled = false; //Sinon on coupe les Timers
                timer2.Enabled = false;
            }
        }

        public void Del_ListBox_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear(); //Clear la ListBox
            chart1.Series[0].Points.Clear(); //Clear le Graph
            textBox1.Clear(); //Clear la TextBox
        }

        private void toExcel_Click(object sender, EventArgs e)
        {
            Excel.Application oXL;    //Définition d'une nouvelle application Excel
            Excel.Workbook oWB;       //Définition d'un classeur
            Excel.Worksheet oSheet;   //Définition d'une feuille

            object misValue = System.Reflection.Missing.Value;

            // initialisation feuille excel
            try
            {
                oXL = new Excel.Application(); //myExcelApp est créee par Excel.Application
                oXL.Visible = true;            //Ouvre Excel automatiquement après l'export
                FileInfo fi = new FileInfo(ApplicationForm.ExecutablePath);

                oWB = (Excel.Workbook)(oXL.Workbooks.Open(Path.Combine(fi.DirectoryName, "Acquisition.xls"))); //Ouvre le fichier Acquisition.xls
                oSheet = (Excel.Worksheet)oWB.ActiveSheet;

                Excel.Range oRange = (Excel.Range)oSheet.get_Range("A3", "B30000"); //Ecrit les données de la cellule A3 a B30000
                oRange.Clear();


                //écriture dans feuille excel
                for (int i = 0; i < Math.Min(listBox1.Items.Count - 1, 27997); i++)
                {
                    oXL.Cells[i + 3, 2] = listBox1.Items[i].ToString(); //On inscrit toutes les valeurs de la ListBox les une en dessous des autres à partir de B3
                    if (i == 0)
                    {
                        oXL.Cells[3, 1] = 0; //Permet d'écrire le temps dans A3
                    }
                    else
                    {
                        oXL.Cells[i + 3, 1] = i * 0.02; //Permet d'écrire le temps dans A4 jusque autant de mesure par pas de 0,02 (50hz)
                    }
                }
            }
            catch
            {
                MessageBox.Show("L'exportation n'a pas été effectuée"); //Si exportation Excel plante, message d'erreur
            }
        }
    }
}

NB : y a deux timer dans le code car j'ai une acquisition à 50hz dans une listbox et une a 10hz dans une textbox :wink:
Voila, ceci fonctionne très bien pour lire l'entrée analogique A1