elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica
| | |-+  Arduino + Comunicación serial + C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arduino + Comunicación serial + C#  (Leído 9,314 veces)
Mr.Blue


Desconectado Desconectado

Mensajes: 441



Ver Perfil WWW
Arduino + Comunicación serial + C#
« en: 4 Marzo 2016, 03:21 am »

Buenas,

Consulta estoy testeando la comunicación serial en mi arduino, arme el código y lo subí al ATMEGA, al utilizar monitor serie de del IDE de arduino puedo prender y apagar 2 leds. Es decir que el código funciona OK.
El problema surge cuando quiero realizar la comunicación con C#. Cuando veo el arduino  apretó algún botón para prender o apagar un led desde la aplicación en C# enciende el led RX del arduino como si estuviera recibiendo la orden pero no enciende el led.

¿Alguna idea de que puede ser?
Una observación: No tengo fuente externa, es decir alimento con USB. Para un par de leds no creo que afecte.

Por las dudas dejo el código pero no tiene nada raro es bastante sencillo.

Código
  1. using System.Drawing;
  2. using System.Linq;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using System.IO.Ports;
  6.  
  7. namespace SerialArduino
  8. {
  9.    public partial class Form1 : Form
  10.    {
  11.        SerialPort mySerial;
  12.  
  13.        public Form1()
  14.        {
  15.            InitializeComponent();
  16.            init();
  17.        }
  18.        private void init()
  19.        {
  20.            try
  21.            {
  22.  //              if (mySerial.IsOpen == false)
  23.  //              {
  24.                    mySerial = new SerialPort();
  25.                    mySerial.BaudRate = 9600;
  26.                    mySerial.PortName = "COM3";
  27.                    mySerial.Open();
  28.  //              }
  29.            }
  30.            catch (Exception)
  31.            {
  32.                MessageBox.Show("Error");
  33.            }
  34.  
  35.            button1.Enabled = true;
  36.            button2.Enabled = false;
  37.            button3.Enabled = true;
  38.            button4.Enabled = false;
  39.        }
  40.  
  41.        private void button1_Click(object sender, EventArgs e)
  42.        {
  43.            try
  44.            {
  45.                mySerial.Write("led1");
  46.                mySerial.Write("on");
  47.  
  48.                button1.Enabled = false;
  49.                button2.Enabled = true;
  50.  
  51.            }
  52.            catch (Exception)
  53.            {
  54.                MessageBox.Show("Error");
  55.            }
  56.        }
  57.  
  58.        private void button2_Click(object sender, EventArgs e)
  59.        {
  60.            try
  61.            {
  62.                mySerial.Write("led1");
  63.                mySerial.Write("off");
  64.  
  65.                button1.Enabled = true;
  66.                button2.Enabled = false;
  67.            }
  68.            catch (Exception)
  69.            {
  70.                MessageBox.Show("Error");
  71.            }
  72.  
  73.        }
  74.  
  75.        private void button3_Click(object sender, EventArgs e)
  76.        {
  77.            try
  78.            {
  79.                mySerial.Write("led2");
  80.                mySerial.Write("on");
  81.                string var = mySerial.ReadLine();
  82.                MessageBox.Show(var);
  83.  
  84.                button3.Enabled = false;
  85.                button4.Enabled = true;
  86.            }
  87.            catch (Exception)
  88.            {
  89.                MessageBox.Show("Error");
  90.            }
  91.        }
  92.  
  93.        private void button4_Click(object sender, EventArgs e)
  94.        {
  95.            try
  96.            {
  97.                mySerial.Write("led2");
  98.                mySerial.Write("off");
  99.  
  100.                button3.Enabled = true;
  101.                button4.Enabled = false;
  102.            }
  103.            catch (Exception)
  104.            {
  105.                MessageBox.Show("Error");
  106.            }
  107.        }
  108.    }
  109. }
  110.  

El código de arduino
Código
  1. int led1 = 2;
  2. int led2 = 3;
  3. //int led3 = 4;
  4. String selectedLed;
  5. String selectedStatus;
  6.  
  7. void setup() {
  8.  // put your setup code here, to run once:
  9.  Serial.begin(9600);
  10.  pinMode(led1, OUTPUT);
  11.  pinMode(led2, OUTPUT);
  12. //  pinMode(led3, OUTPUT);
  13. }
  14.  
  15. void loop() {
  16.  selectedLed = "";
  17.  selectedStatus = "";
  18.  // put your main code here, to run repeatedly:
  19.  while(Serial.available()==0){
  20.  }
  21.  selectedLed = Serial.readString();
  22.  
  23.  while(Serial.available()==0){
  24.  }
  25.  selectedStatus = Serial.readString();
  26.  
  27.  Serial.println(selectedLed);
  28.  Serial.print(selectedStatus);
  29.  if (selectedLed == "led1")
  30.  {
  31.    if (selectedStatus == "on")
  32.    {
  33.      digitalWrite(led1,HIGH);
  34.    }
  35.    else
  36.    {
  37.      if(selectedStatus == "off")
  38.      {
  39.        digitalWrite(led1,LOW);
  40.      }
  41.    }
  42.  }
  43.  else
  44.  {
  45.    if(selectedLed == "led2")
  46.    {
  47.      if (selectedStatus == "on")
  48.      {
  49.        digitalWrite(led2,HIGH);
  50.      }
  51.      else
  52.      {
  53.        if(selectedStatus == "off")
  54.        {
  55.          digitalWrite(led2,LOW);
  56.        }
  57.      }
  58.    }
  59.  }
  60. }
  61.  


En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Arduino + Comunicación serial + C#
« Respuesta #1 en: 4 Marzo 2016, 08:54 am »

Hola:

Te dejo mis documentos que hice sobre encender y apagar un Led Arduino con C# y otros lenguajes de Visual Studio. También otro documento a la hora de recibir datos desde Arduino y C#.



Prueba este código de Arduino y compruebas si te funciona.

Código
  1. int led1 =  2;   // Declaramos la variable pin del Led 1.
  2. int led2 =  3;   // Lo mismo para el Led 2.
  3. char caracter;
  4. String comando;
  5.  
  6. void setup()
  7. {
  8.  Serial.begin(9600);
  9. }
  10.  
  11. void loop()
  12. {
  13.  pinMode(led1, OUTPUT);  // Inicializa el pin del Led 1 como salida.
  14.  pinMode(led2, OUTPUT);
  15.  /* Voy leyendo carácter a carácter lo que se recibe por el canal
  16.    *  serie (mientras llegue algún dato allí), y los voy concatenando
  17.    *  uno tras otro en una cadena. En la práctica, si usamos el
  18.    *  "Serial monitor" el bucle while acabará cuando pulsemos Enter.
  19.    *  El delay es conveniente para no saturar el canal serie y que la
  20.    *  concatenación se haga de forma ordenada.
  21.    */
  22.  while (Serial.available() > 0)
  23.  {
  24.    caracter= Serial.read();
  25.    comando.concat(caracter);
  26.    delay(10);
  27.  }
  28.  
  29.  /* Unavez ya tengo la cadena "acabada", compruebo su valor y hago
  30.    * que la placa Arduino reaccione según sea este. Aquí podríamos
  31.    * hacer lo que quiesiéramos: si el comando es "tal", enciende
  32.    * un Led, si es cual, mueve un motor... y así.
  33.    */
  34.  
  35.   // Led 1.
  36.  if (comando.equals("on1") == true)
  37.  {
  38.        digitalWrite(led1, HIGH); // Enciende el Led.
  39.        Serial.println("Led 1 encendido.");
  40.  }
  41.  
  42.  if (comando.equals("off1") == true) // Led_OFF.
  43.  {
  44.        digitalWrite(led1, LOW); // Apaga el Led.
  45.        Serial.println("Led 1 apagado.");
  46.  }
  47.  
  48.  // Led 2.
  49.  if (comando.equals("on2") == true)
  50.  {
  51.        digitalWrite(led2, HIGH); // Enciende el Led.
  52.        Serial.println("Led 2 encendido.");
  53.  }
  54.  
  55.  if (comando.equals("off2") == true) // Led_OFF.
  56.  {
  57.        digitalWrite(led2, LOW); // Apaga el Led.
  58.        Serial.println("Led 2 apagado.");
  59.  }
  60.  // Limpiamos la cadena para volver a recibir el siguiente comando.
  61.  comando="";
  62. }
  63.  

Tendrás que modificar cosas de C#, como los comandos a enviar que son on1, off1, on2 y off2.

Fíjate en los enlaces arriba, si lo quieres en PDF directo pues te dejo uno aquí y otro aquí.

En C#, procura enviar datos en tramas de bytes o al menos codificado, ejemplo, haz puesto esto:
Código
  1. mySerial.Write("led1");
  2.                mySerial.Write("off");

Prueba co ntu mismo código C# usando esto entre medio, así no se trunca.
Código
  1. mySerial.Write("led1");
  2. Thread.Sleep(2000);
  3.                mySerial.Write("off");
No olvidar el using llamado:
Código
  1. using System.Threading;

Más información aquí.
https://msdn.microsoft.com/es-es/library/d00bd51t%28v=vs.110%29.aspx

Lo sustituye por este otro.
Código
  1.            byte[] mBuffer = Encoding.ASCII.GetBytes("on1"); // Envía comando ACTUALIZAR por el puerto.
  2.            mySerial.Write(mBuffer, 0, mBuffer.Length);

Además, veo que envías led1 y acto seguido off, claro que no te funciona, lo envías todo junto y sin haber espacios por medio al menos con un tiempo.

No olvide que en los PDF te puede descargar proyecto completo de Visual C# para qu ehagas pruebas con Arduino.

Saludos.


« Última modificación: 4 Marzo 2016, 11:01 am por Meta » En línea

Mr.Blue


Desconectado Desconectado

Mensajes: 441



Ver Perfil WWW
Re: Arduino + Comunicación serial + C#
« Respuesta #2 en: 5 Marzo 2016, 04:09 am »

Gracias Meta, justo luego de postear vi que habías publicado un tutorial relacionado. Probando el código que me pasas anda 10 puntos.

Ya se me había cruzado por la cabeza que el problema debía estar al mandar la escritura al puerto sin ningún tipo de delay.

Código
  1. mySerial.Write("led1");
  2. mySerial.Write("off");

Aun así usando el mismo código Arduino que publique mas el Sleep que sugerís para darle tiempo a ejecutar el comando y no se trunque, sigue sin funcionar.
Código
  1. mySerial.Write("led1");
  2. Thread.Sleep(2000);
  3. mySerial.Write("off");

Viendo el código arduino que me pasaste haces uso de un único IMPUT. El cual evalúa si es: on1, off1, on2, off2.
El punto es, que pasa si en mi comunicación serial necesito ingresar mas de una comando?.

Ahí revisando un poco mas pude hacer que funcione con el mismo código arduino que pase.
Lo único que agregue en C#, fue lo que me dijiste.
Código
  1. mBuffer = Encoding.ASCII.GetBytes("led2"); // Envía comando ACTUALIZAR por el puerto.
  2. mySerial.Write(mBuffer, 0, mBuffer.Length);
  3. Thread.Sleep(2000);
  4. mBuffer = Encoding.ASCII.GetBytes("on"); // Envía comando ACTUALIZAR por el puerto.
  5. mySerial.Write(mBuffer, 0, mBuffer.Length);
  6.  
Por lo visto, no le gusto el serial.Write crudo jaja.

Gracias por la mano!!
Saludos
« Última modificación: 5 Marzo 2016, 04:16 am por Mr.Blue » En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Arduino + Comunicación serial + C#
« Respuesta #3 en: 5 Marzo 2016, 08:31 am »

Hola:

Me alegro que te funcione. En cuanto a la pregunta sobre que pasa si envías más de un comando. Simplemente envías comandos en una cadena desde Arduino y usa delimitadores en C# para separar esos comandos de una cadena para luego interpretarlo.

También puedes hacerlo como hiciste usando varias veces el mySerial pero la manera como te he presentado. Lo hicieste.
Código
  1. mBuffer = Encoding.ASCII.GetBytes("led2"); // Envía comando ACTUALIZAR por el puerto.
  2. mySerial.Write(mBuffer, 0, mBuffer.Length);
  3. Thread.Sleep(2000);
  4. mBuffer = Encoding.ASCII.GetBytes("on"); // Envía comando ACTUALIZAR por el puerto.
  5. mySerial.Write(mBuffer, 0, mBuffer.Length);

En caso que tuvieras problemas con los Enconding, lo haces que funcione seguro por tramas de bytes de esta manera y funciona al 100 %.
Código
  1. private void button_t_Click(object sender, EventArgs e)
  2. {
  3.    byte[] mBuffer = new byte[5];
  4.    mBuffer[0] = 0x74;
  5.    mBuffer[1] = 0x75;
  6.    mBuffer[2] = 0x89;
  7.    mBuffer[3] = 0x20;
  8.    mBuffer[4] = 0x6C;
  9.    serialPort1.Write(mBuffer, 0, mBuffer.Length);
  10. }

Eso si, tienes que mirar la tabla ASCII.


Esto lo publiqué aquí hace tiempo.
http://www.codeproject.com/Articles/46603/A-PicRS-control-with-a-PIC-microcontroller-seri

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Comunicacion por serial
ASM
lexoazul 6 8,092 Último mensaje 6 Noviembre 2011, 04:47 am
por lexoazul
Comunicacion Arduino-Servidor
Electrónica
arcross88 1 2,675 Último mensaje 26 Junio 2016, 02:35 am
por peter_lyon
(Arduino) ¿Qué estructura de paquete me recomiendan para comunicación serial?
Electrónica
class_OpenGL 2 3,541 Último mensaje 1 Febrero 2017, 13:50 pm
por PalitroqueZ
Comunicación a Arduino mediante lenguaje en c (puerto Serial)
Programación C/C++
Emily 2 2,368 Último mensaje 12 Junio 2017, 09:46 am
por Emily
Arduino, C++ , Puerto Serial o USB y Linux
Electrónica
aecp95 4 5,826 Último mensaje 15 Agosto 2017, 03:07 am
por PalitroqueZ
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines