Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#531
Hola:

Quiero recibir datos por el puerto serie. He hecho varios ejemplos. Lo más sencillo es este código de abajo, solo tiene que mostrar número en la posición que yo quiera X, Y del 0 al 1023 que recibe todo el rato. El código le llega desde Arduino y su código es.

Código Arduino:
int valorPot=0;

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

void loop(){
     valorPot=analogRead(2);
     Serial.println(valorPot);
     delay(100); // 0.1 segundos.
}


Código C#:
Código (csharp) [Seleccionar]
using System;
using System.IO.Ports; // No olvidar.
using System.Collections.Generic;

namespace Porcentaje_Barra_P_Serie_Consola_2_CS
{
    class Program
    {
        public static string Recibidos = "";

        // Como variables de clase
        public static string[] Separador = new string[] { ",", "\r", "\n", "/n" };
        public static List<string> Leo_Dato = new List<string>();

        static void Main(string[] args)
        {
            Console.Title = "Serial Port C#";

            int Variar_este_valor = 0; // De 0 a 1023.

            SerialPort Puerto_serie;

            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
            Puerto_serie = new SerialPort();

            // Configuración.
            Puerto_serie.PortName = "COM4"; // Número del puerto serie.
            Puerto_serie.BaudRate = 115200; // Baudios.
            Puerto_serie.Parity = Parity.None; // Paridad.
            Puerto_serie.DataBits = 8; // Bits de datos.
            Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
            Puerto_serie.Handshake = Handshake.None; // Control de flujo.

            // Establecer la lectura / escritura de los tiempos de espera.
            Puerto_serie.ReadTimeout = 500;
            Puerto_serie.WriteTimeout = 500;
               
            Puerto_serie.Open(); // Abre el puerto serie.

            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {

            // En el evento.
            Leo_Dato.Clear();
            Leo_Dato.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));

            SerialPort sp = (SerialPort)sender;
            Recibidos = sp.ReadLine();
            Console.SetCursorPosition(5, 10); // Posición X, Y.
            Console.Write(Recibidos);
        }
    }
}


Cuando varío el potenciómetro de Arduino, en el puerto serie del PC, en pantalla de C# o modo consola, tiene que aparecer valores que lee el programa, la pantalla se apaga rápido.

¿Alguna idea?

Saludos.
#532
Hola:

En documento dice.

Las otras ventanas de depuración:
Hay muchas otras ventanas disponibles para la depuración, pero algunas no son realmente útiles
para el desarrollo de aplicaciones con Visual C#. Se reservan más para la prueba de aplicaciones
desarrolladas con otros lenguajes, C++ por ejemplo.
Por ejemplo, es el caso de la ventana de memoria que permite la visualización del contenido de una
zona de memoria de la cual conocemos la dirección.



Sobre todo en la MEmoria, que para ver esto uso programa de editor hexadecimales externos como este.

He estado buscan doe en Visual Stduuio .net Community 2015 y nada. Al menos quiero saber si lo incluye en esta versión.

Saludos.
#533
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 (csharp) [Seleccionar]
mBuffer = Encoding.ASCII.GetBytes("led2"); // Envía comando ACTUALIZAR por el puerto.
mySerial.Write(mBuffer, 0, mBuffer.Length);
Thread.Sleep(2000);
mBuffer = Encoding.ASCII.GetBytes("on"); // Envía comando ACTUALIZAR por el puerto.
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 (csharp) [Seleccionar]
private void button_t_Click(object sender, EventArgs e)
{
    byte[] mBuffer = new byte[5];
    mBuffer[0] = 0x74;
    mBuffer[1] = 0x75;
    mBuffer[2] = 0x89;
    mBuffer[3] = 0x20;
    mBuffer[4] = 0x6C;
    serialPort1.Write(mBuffer, 0, mBuffer.Length);
}


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.
#534
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#.

[youtube=640,360]https://www.youtube.com/watch?v=Ra2PBfLFuHk[/youtube]

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


int led1 =  2;   // Declaramos la variable pin del Led 1.
int led2 =  3;   // Lo mismo para el Led 2.
char caracter;
String comando;

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

void loop()
{
 pinMode(led1, OUTPUT);  // Inicializa el pin del Led 1 como salida.
 pinMode(led2, OUTPUT);
 /* Voy leyendo carácter a carácter lo que se recibe por el canal
  *  serie (mientras llegue algún dato allí), y los voy concatenando
  *  uno tras otro en una cadena. En la práctica, si usamos el
  *  "Serial monitor" el bucle while acabará cuando pulsemos Enter.
  *  El delay es conveniente para no saturar el canal serie y que la
  *  concatenación se haga de forma ordenada.
  */
 while (Serial.available() > 0)
 {
   caracter= Serial.read();
   comando.concat(caracter);
   delay(10);
 }

 /* Unavez ya tengo la cadena "acabada", compruebo su valor y hago
  * que la placa Arduino reaccione según sea este. Aquí podríamos
  * hacer lo que quiesiéramos: si el comando es "tal", enciende
  * un Led, si es cual, mueve un motor... y así.
  */

  // Led 1.
 if (comando.equals("on1") == true)
 {
       digitalWrite(led1, HIGH); // Enciende el Led.
       Serial.println("Led 1 encendido.");
 }
       
 if (comando.equals("off1") == true) // Led_OFF.
 {
       digitalWrite(led1, LOW); // Apaga el Led.
       Serial.println("Led 1 apagado.");
 }
 
 // Led 2.
 if (comando.equals("on2") == true)
 {
       digitalWrite(led2, HIGH); // Enciende el Led.
       Serial.println("Led 2 encendido.");
 }
       
 if (comando.equals("off2") == true) // Led_OFF.
 {
       digitalWrite(led2, LOW); // Apaga el Led.
       Serial.println("Led 2 apagado.");
 }
 // Limpiamos la cadena para volver a recibir el siguiente comando.
 comando="";
}


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 (csharp) [Seleccionar]
mySerial.Write("led1");
               mySerial.Write("off");


Prueba co ntu mismo código C# usando esto entre medio, así no se trunca.
Código (csharp) [Seleccionar]
mySerial.Write("led1");
Thread.Sleep(2000);
               mySerial.Write("off");

No olvidar el using llamado:
Código (csharp) [Seleccionar]
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 (csharp) [Seleccionar]
           byte[] mBuffer = Encoding.ASCII.GetBytes("on1"); // Envía comando ACTUALIZAR por el puerto.
           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.
#535
Hola:

Es verdad una cosa, que este tema es del 2013, disculpe usted.

Siguiendo el tema, a pesar de ser viejo me parece interesante, se habla mucho que HTML5 hasta ha tumbado WPF, es decir, hasta leí que Microsoft dijo que en esta versión 2015 no habrá cambios notorios. Será porque es un framework 4.6, el 5 tiene que venir con artas de novedades. VB 6, veo que todavía lo usan miucha gente y sigue haciendo videotutoriales por todas parte sen youtube, a parte de ello hasta para electrónica. Tienes razón de que puede estar décadas un lenguaje.

Otra cosa que leí, el WPF, SilverLight y Flash, por el HTML5 se han quedado en desuso, así que el WPF no me convence por ahora mucho, pero hago cosas con los dos al mismo tiempo por ver comparativas. Aún sigo sin ver que lo usen muchas personas, no en los foros del MSDN están mucho que digamos con el WPF, es más, se meten con el HTML5 porque le ve más futuro, eso sin contar con el HTML6 en el futuro, sigue siendo HTML.

Ver documento con AWF y WPF con C#, VB .net y el CLR de Visual C++.

Sacan WPF y ya se considera obsoleto en poco tiempo por el santo HTML5. De todas maneras, me la juego que Microsoft está haciendo algo a lo zorro, en plan oculto, ya que desde el 2010 el FrameWork es de base el 4 hasta ahora, 4.6. Luego sacan un super producto con muchísimos cambios fuertes que hasta ahora solo son poco.

El tiempo ya dirá.

Saludos.

PD: Estoy decepcionado que Windows Form y WPF están ya obsoletos y no hagan actualizaciones grandes como antes, por eso creo que sacarán otra tecnología más adelante. Lo que llega hacer HTML5 hoy en día.
#536
Hola:

Por ahora me gusta mucho más acr interfaz para electónica y PIC o Arduino con Windows Form que el WPF. Lo qu eme gusta del WPF es la estética. Aún le queda mucho por hacer WPF si quiere estar a la altura en muchas cosas que aún no lo han incluido. Fíjate tu que la mayoría están usando Windows Form por todas partes.

LA barra de progress Bar de Windows Form no se le puede cambiar el color facilmente en las propiedades y en WPF lo haces directamente de forma muy fácil, esos detalles no entiendo a estas altura de la vida que no lo hayan progrmado así.

He oído que Windows Form Microsoft lo medi avandonó. Una lástima, me encanta más que el WPF en muchos aspectos.

Saludos.
#537
Hola:

Hice un pequeño programa, más bien adaptado del AWP a WPF bajo Visual C# 2015. En AWP me funciona en tiempo real a la hora de recibir datos diferentes, en WPF se queda congelado en el momento de recibir el primer dato. Si cambio los datos, cierro el programa y lo vuelvo abrir, se muestra los nuevos valores y se queda congelado.



El código fuente de C# WPF.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.IO.Ports; // No olvidar.

namespace Arduino_In_Analogico_Prueba_01_WPF
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // Utilizaremos un string como buffer de recepción.
        string Recibidos;
        SerialPort serialPort1 = new SerialPort();

        public MainWindow()
        {
            InitializeComponent();

            // Configuramos el puerto serie.
            serialPort1.BaudRate = 115200; // Baudios, tiene que ser el mismo que Arduino.
            serialPort1.PortName = "COM4"; // Elegijos el mismo puerto que de Arduino.
            serialPort1.Parity = Parity.None; // Nada de paridad.
            serialPort1.DataBits = 8; // 8 bits.
            serialPort1.StopBits = StopBits.Two; // Recomendado con 2 bits de Stop o parada.

            // Abrir y mantener abierto el puerto serie mientras se ejecute la aplicación.
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }

            // Ejecutar la función Recepción por disparo del evento ¡DataReived!
            serialPort1.DataReceived += Recepcion;
        }

        private void Recepcion(object sender, SerialDataReceivedEventArgs e)
        {
            // Acumular los caracteres recibidos a nuestro "buffer" (string).
            Recibidos += serialPort1.ReadExisting();

            // Invocar o llamar al proceso de tramas.
            this.Dispatcher.Invoke(Actualizar);
        }


        // Como variables de clase
        private string[] Separador = new string[] { ",", "\r", "\n", "/n" };
        private List<string> Leo_Dato1 = new List<string>();

        // Procesar los datos recibidos en el bufer y extraer tramas completas.
        private void Actualizar()
        {
            double Voltaje = 0;
            double Porcentaje = 0;

            // En el evento
            Leo_Dato1.Clear();
            Leo_Dato1.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));

            label_Lectura_Potenciometro.Content = Leo_Dato1[0].ToString();
            progressBar.Value = Convert.ToInt32(Leo_Dato1[0].ToString());

            double Dato_Voltaje = Convert.ToDouble(Leo_Dato1[0]);
            double Dato_Porcentaje = Convert.ToDouble(Leo_Dato1[0]);

            Voltaje = Dato_Voltaje * (5.00 / 1023.00);
            Porcentaje = Dato_Porcentaje * (100.00 / 1023.00);

            label_Voltaje.Content = Voltaje.ToString("N2") + " V.";
            label_Portentaje.Content = Porcentaje.ToString("N0") + " %";
        }
    }
}


¿Hay alguna solución?

Saludos.
#538
Lo que intentas hace es lo que hace .bat pasarlo a C#?????
#539
Cita de: ssmateos en  2 Marzo 2016, 11:55 AM
voy a probar! mil gracias, que majos madre!  ;-) ;-) ;-)

Después de tanto sufrimiento que te vi en los foros de MSDN te veo contento. Nos avisa si te ha funcionado.

Leí hace tiempo que la competencia del .bat de CMD es el .vbs Visual Basic Script, luego hay otros más y el más que usan ahora en empresas es el F#. Aquí encontré una respuesta que hicieron hace tiempo.

Nos avisa y nos muestra tu resultado.

Suerte...
#540
Hola:

¿Exactamente que hace lo que buscas?

Puedes traducir del bat a C# para que haga lo mismo.

Saludos.