Autor Tema: Ejemplo - Puerto serie y C# 2008  (Leído 54516 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8259
    • Sitio de MigSantiago
Ejemplo - Puerto serie y C# 2008
« en: 16 de Mayo de 2009, 16:50:21 »
Acabo de hacer un pequeño programa que recibe una imagen tomada por Bluetooth a través de un COM virtual usando C#. Este programa funciona de la misma manera con cualquier otro COM, incluso con nuestros PICs. Se necesita tener Visual C# 2008 instalado pero también debe funcionar con versiones anteriores. Les comparto los pasos que hay que llevar a cabo para que manejen el suyo.

Para usar el puerto COM es más fácil que nunca.

- Ir al cuadro de Herramientas y tomar un SerialPort y dibujarlo en cualquier parte de la ventana principal.

- En su ventana de propiedades hay que detallar sus características. Las principales son:
  + Name. Cualquier nombre que te guste. El mío se queda en serialPort1.
  + BaudRate. Velocidad en bps. Solo útil si el puerto es físico y no virtual.
  + PortName. El nombre del puerto COM. Si usas los físicos serán COM1 o COM2. Si usas virtuales serán números mayores.
  + ReadBufferSize. Tamaño máximo del buffer. Si dejas que se llene perderás datos.



- Para monitorear cuando llegan los datos deberás implementar una función detonada por evento. Da click en el serialPort1 y después en el iconito con forma de rayo en la ventana Propiedades.

- Da doble click en DataReceived y se creará una función que se va a ejecutar cada que se recibe cualquier dato en el puerto.

- En esta función podrás indagar cuántos bytes tienes pendientes en el buffer y recolectarlos en un arreglo de bytes:
Código: [Seleccionar]
  int bytes = serialPort1.BytesToRead;
  byte[] buffer = new byte[bytes];
  serialPort1.Read(buffer, 0, bytes);

- Para iniciar el funcionamiento del puerto solo debes usar:
Código: [Seleccionar]
  serialPort1.Open();
- Para cerrarlo:
Código: [Seleccionar]
  serialPort1.Close();
- Para enviar bytes por el puerto:
Código: [Seleccionar]
  serialPort1.Write(byte[] buffer, offset, count);  Donde offset es un byte inicial y count es el máximo de bytes que quieres enviar del arreglo buffer
  Esa función tiene otras sobrecargas.

Les dejo un ejemplo para recibir un número desconocido de bytes y guardarlos en un archivo binario.

Código: [Seleccionar]
        //////////////////////////////
        //Variable global
        List<byte> recibido = new List<byte>();

        //////////////////////////////
        //Abrir puerto COM14
        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            recibido.Clear();
        }

        //////////////////////////////
        //Datos en el buffer
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int bytes = serialPort1.BytesToRead;

            byte[] buffer = new byte[bytes];

            serialPort1.Read(buffer, 0, bytes);
            foreach(byte elem in buffer)
            {
                recibido.Add(elem);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
           
            //Guarda todo en archivo
            if (File.Exists("Prueba.jpg"))
                File.Delete("Prueba.jpg");
            FileStream archivoP = new FileStream("Prueba.jpg",
                FileMode.OpenOrCreate, FileAccess.Write);
            BinaryWriter escribirP = new BinaryWriter(archivoP);
            foreach(byte elem in recibido)
            {
                escribirP.Write(elem);
            }
            escribirP.Close();
            archivoP.Close();
            Process.Start("Prueba.jpg");
        }

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 997
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #1 en: 20 de Mayo de 2009, 02:06:31 »
excelente ejemplo, muchas gracias, me viene de perlas este ejemplo, saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 997
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #2 en: 20 de Mayo de 2009, 04:00:56 »
una pregunta, tengo que incluir alguna libreria para poder probarlo, me da error al poner file o filestream, como si no lo reconociera, saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8259
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #3 en: 20 de Mayo de 2009, 11:51:03 »
Hola

Tienes que agregar la clase IO.

Código: [Seleccionar]
using System.IO;                        //Requerido para manejar archivos

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 997
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #4 en: 20 de Mayo de 2009, 17:45:03 »
muchas gracias, me fui a ayuda y lo encontre, tambien hay que incluir el system.diagnostics
saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8259
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #5 en: 20 de Mayo de 2009, 18:21:55 »
No necesariamente, el System.Diagnostics sirve para abrir el archivo que recién creaste. Puedes comentar la instrucción Process.Start("archivo.txt");

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 997
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #6 en: 20 de Mayo de 2009, 22:37:01 »
a mi me salia error y pense que tambien incluyendo un archivo mas, se terminaria, la verdad no soy nada bueno en c#, ni ninguna suite de visual studio, o delphi, o lo que sea, jejeje, saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8259
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #7 en: 21 de Mayo de 2009, 14:10:22 »
Si has programado Java o C, C# te parecerá súper fácil.

Lo que más me gusta de la Express Edition es que al estar escribiendo un programa te presenta ayudas contextuales. Por ejemplo, para el puerto serie...



Y además compila mientras escribes. Antes de que acabes una línea ya te está marcando los errores de sintaxis, funciones, e incluso ámbito de variables locales, privadas, globales, etc.

A mi me gustó mucho y la curva de aprendizaje de este lenguaje es exponencial  8)

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 997
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #8 en: 22 de Mayo de 2009, 01:32:00 »
eso si es cierto, me gusta mucho esta suite, y es por eso que estoy empezando a aprender a manejarlo decentemente, talvez despues me meta con sql, pero todo lento y seguro, saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3116
    • Automation Media Lab
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #9 en: 22 de Mayo de 2009, 06:08:33 »
Me viene de 10 (dieceses)  :mrgreen:

Aunque no le agarro bien el rollo , a mi parecer xD por ahora similar a vb y qu ebueno eso que de ahi vengo xD.

Pero no le agarro el hilo , qu eno pueod ni cambiar el contenido de los labels ni botones >_<

Será con más tiempo.

Muchismias gracias y un saludoski!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8259
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #10 en: 22 de Mayo de 2009, 12:23:15 »
Akena, cómo crees...  :D

Hay una ventanita de Propiedades y se llama Text y Name ahí sale todo.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3116
    • Automation Media Lab
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #11 en: 22 de Mayo de 2009, 14:30:31 »


Si , eso si lo he visto xD no soy tan tan xD un poco nada más xD

Pero digo amm cambiarlo al preisonar un boton etc...

Es que en VB xD le daba creo recordar button1.text= Botoncito y ya me cambiaba el titulo del boton xD

Cosas asi.

Es que ando de noob xD

^^

Ya que entre más en acción espero colaborar con algo , por lo mientras de chismoson xD
Saludos!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8259
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #12 en: 22 de Mayo de 2009, 16:21:20 »
jjajajaj  :D

Es bien fácil Akena...

Código: [Seleccionar]
btnBotoncito.Text="Apriétame";

Bueno, nos avisas cuando te atores en otro programa.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3116
    • Automation Media Lab
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #13 en: 22 de Mayo de 2009, 22:31:55 »
Ya veo el error xD

No lo puse entre comillas!!

Y Cuando daba click , me safloa FORM1  xD

Gracias MIg!!

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1677
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #14 en: 17 de Agosto de 2009, 12:21:39 »
apenas me vengo iniciando en el C# y me a parecido de lo mas facil este cuento del puerto serie, pero su sintaxis si me parece alguito complicada.

ya pude visualizar en un textbox lo q recibo por el puerto serie, pero yo recibo dos datos, uno de temperatura que viene entre dos 'T', es decir 'T30T' y uno de nivel q viene entre dos 'N', es decir 'N20N', como hago para discriminar estas letras, deberia primero guardar el dato en algun buffer y despues recorrerlo para encontrar esas letras??

saludos
« Última modificación: 17 de Agosto de 2009, 12:28:02 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA