Ir ao conteúdo
  • Cadastre-se

C# Como integrar Leitura e Escrita Serial Arduino C# sem dar conflito?


MicSG

Posts recomendados

  • Membro VIP

Olá.

Tenho um problema. Eu consegui realizar o processo de escrita serial no Arduino através do Windows Forms C#:

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.IO.Ports; // Esta biblioteca é essencial para a comunicação serial
using System.Windows.Forms;

namespace TesteSerialArduino
{
    public partial class Form1 : Form
    {

        bool estado = false;
       


        //SerialPort s;

        public Form1()
        {
            InitializeComponent();

            serialPort1.BaudRate = 9600;
            serialPort1.PortName = "COM3";


          
           
        }

        private void comunicTx(string cTx) // transmite
        {
            if (!serialPort1.IsOpen) // Se a porta serial não estiver disponível
            {
                try
                {

                    serialPort1.Open();
                    comunicTx(cTx);
                    
                    serialPort1.Write(cTx);
                    serialPort1.Close();

                }
                catch
                {
                    MessageBox.Show("Conecte seu Arduino na porta USB.", "Atenção",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                }
            }
        }


       



        private void btnLigaDesliga_Click(object sender, EventArgs e)
        {
           if (estado == false)
            {
                
                comunicTx("0"); // Opção 0 do Arduino
                btnLigaDesliga.Text = "Ligar";
                label1.ForeColor = Color.Red;
                label1.Text = "Desligado";
                estado = false;

            }
            else
            {
                
                comunicTx("1"); // Opção 1 do Arduino
                btnLigaDesliga.Text = "Desligar";
                label1.ForeColor = Color.Green;
                label1.Text = "Ligado";
                estado = true;
            }

            estado = !estado;

        }

        
        
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                }
            }
            catch
            { }
        }

               
    }
}

Está funcionando sem problemas: ao clicar no botão 'btnLigaDesliga' (neste momento com o texto desliga), é enviado ao arduino o caractere "0". O text do botão 'btnLigaDesliga' é mudado para "Ligar". Através do comando  estado = !estado; a função do botão é alterada para desligar.

Neste momento ao clicar novamente,  é enviado ao arduino o caractere "1".

 

No arduino o código é:


 boolean teste = false;

void Lampada()
{
  if(digitalRead(13) == HIGH)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
}

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

void loop()
{
   

  if(Serial.available()) // Se a comunicação Serial estive disponível..
  {
    char op = Serial.read(); // Leia a op (Opção) da Serial.
    
    if (op == '0')
    {
     digitalWrite(13, LOW);
     Serial.println("Desligado");
     delay(200);
     
    }
    if (op == '1')
    {
      digitalWrite(13, HIGH);
      Serial.println("Desligado");
      delay(200);
      
    }
     
    }}
   
  
  

 

 

Para realizar o processo de leitura serial no C# através do Arduino eu também consegui:

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;

namespace LerPortaAnalogicaArduino
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialPort1.BaudRate = 9600;
            serialPort1.PortName = "COM3";
            serialPort1.Open();
            serialPort1.DataReceived += serialPort1_DataReceived;
        }
            private void Form1_Load(object sender, EventArgs e)
            {

            }
        //Aqui começa a leitura serial
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                string line = serialPort1.ReadLine();
                this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
            }

        private delegate void LineReceivedEvent(string line);
        private void LineReceived(string line)
        {
           

            if (line.Contains("T")) // verificar se na string line contém T.
            {
                string temperatura  = line.Substring(1);
                label1.Text = temperatura;  // se verificado que contém, imprime no label1 sem o primeiro caractere.
                progressBar1.Value = int.Parse(temperatura);
            }

            if (line.Contains("R"))
            {
                string pressao = line.Substring(1);
                label3.Text = pressao;  // se verificado que contém, imprime no label1 sem o primeiro caractere.

                pressao = pressao.Substring(0, 2);
               

                progressBar2.Value = int.Parse(pressao);
                
            }

            textBox1.Text = line;



        }
        //Aqui termina a leitura serial
        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

 

No arduino o código é:

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

void loop()
{
  //Os numeros são apenas ilustrativos
Serial.println("R32.52"); //temperatura
delay(1500);

Serial.println("T900"); //pressão atmosferica
delay(1500);

Serial.println("R31.52"); //temperatura
delay(1500);

Serial.println("T902"); //pressão atmosferica
delay(1500);

Serial.println("R30.52"); //temperatura
delay(1500);

Serial.println("T906"); //pressão atmosferica
delay(1500);

Serial.println("R28.52"); //temperatura
delay(1500);

Serial.println("T910"); //pressão atmosferica
delay(1500);


}

 

Resultado:

image.png.fde3f143cb72ff79bf6af9039cd0982e.png

 

 

 

 

 

 

Agora, para integrar os dois códigos, leitura e escrita serial, não estou conseguindo. Como devo proceder para fazer funcionar a leitura e escrita serial?

 

 

Link para o comentário
Compartilhar em outros sites

Boa Noite,

 

Meio Freudiano, ate chato de dizer, mas, a melhor forma de cessar os conflitos é (conversando) encarando.

 

Desconheço os conflitos, mas, já que foste tu que escreveu às metades, tua "interpolação" é um terceiro que a soma dos dois primeiros já conhecidos por nós. Logo a sugestão é, preserva o (dois) código(s) e escrever um terceiro com os comandos logicamento aos pares e compartilhar os primeiros conflitos dessa prática, racionável.

 

Os mais experientes na linguagem ajudam, evidentemente, na discussão dos erros e nas soluções. Particularmente, só um pouco.

"

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...