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

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #15 en: 17 de Agosto de 2009, 12:36:42 »
Puedes separar los datos bien fácil usando la función split. Le das el string completo y split divide en substrings de acuerdo a algún char que le indiques.

Código: [Seleccionar]
            string fila;
            string[] datos;

datos = fila.Split(",".ToCharArray()); //Separa por comas

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1689
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #16 en: 17 de Agosto de 2009, 13:30:56 »
encontre esto segun eso le indico las N y las T y me devuelve el dato..pero ese dato sigue siendo string..para utilizarlo en alguna operacion matematica debo pasarlo a otro tipo?
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #17 en: 17 de Agosto de 2009, 14:34:22 »
Ah, solo hazle un parsing.

Código: [Seleccionar]
String cadena;
float flota;
flota = float.Parse(cadena);

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #18 en: 24 de Agosto de 2009, 17:35:03 »
migsantiago una pregunta...primero pues no se nada de C# por eso pregunto de forma generalizada...

Cuando llega un dato al puerto, ¿el programa atiende al guardado del dato como si de una interrupción se tratase o hay que llamar la función del puerto cada X tiempo y así guardar los datos?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #19 en: 24 de Agosto de 2009, 18:08:27 »
Hola Sauron

Cuando llega un dato al buffer del puerto serial se detona un evento que VC# administra automáticamente. Cuando ocurre el evento se ejecuta una función en donde uno puede revisar si recibió el dato y leer el buffer. Una vez habiendo leído el buffer, éste es vaciado y está listo para recibir más datos.

Los 2 eventos útiles que se pueden monitorear son DataReceived y ErrorReceived.

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #20 en: 24 de Agosto de 2009, 18:29:26 »
Hola Sauron

Cuando llega un dato al buffer del puerto serial se detona un evento que VC# administra automáticamente. Cuando ocurre el evento se ejecuta una función en donde uno puede revisar si recibió el dato y leer el buffer. Una vez habiendo leído el buffer, éste es vaciado y está listo para recibir más datos.

Los 2 eventos útiles que se pueden monitorear son DataReceived y ErrorReceived.

Ok, entonces es como una interrupción pero el VC# lo maneja de forma automática, entonces ¿con inicializar y configurar el puerto basta para que el evento (cuando llega un dato al buffer) se ejecute?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #21 en: 24 de Agosto de 2009, 20:39:31 »
Mmhh, debes vincular el evento con la función que llamará.

Si creas el objeto puertoserie usando las herramientas, es decir, sin escribir código, puedes activar el evento siguiendo los pasos de arriba:

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

Desconozco el código para vincular el evento con la función, pero por eso me gusta C#, porque no tengo que andarlo buscando... solo doy click y listo  :D

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #22 en: 25 de Agosto de 2009, 00:02:27 »
Desconozco el código para vincular el evento con la función, pero por eso me gusta C#, porque no tengo que andarlo buscando... solo doy click y listo  :D

Ya estoy descargando el express edition y según lo que describes se parece entonces al labview, que se trabaja muy poco con códigos y todas las funciones es con bloques. Lo pruebo y les cuento.

Gracias migsantiago

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #23 en: 25 de Agosto de 2009, 12:49:09 »
Sí, es muy amigable como LabView.

Y si eres de los que les gusta escribir código sin asistentes también puedes hacerlo, solo que es más tardado.

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #24 en: 02 de Octubre de 2009, 13:10:18 »
Hola nuevamente!

Como dije anteriormente, estoy totalmente nuevo en C#, así que partiendo de eso, está este código, dónde se tiene la ventana, dos cuadros de texto (uno donde el usuario puede ingresar datos y otro donde muestra un string que llega por puerto serial), y el botón "Enviar"

Código: C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;                        //Requerido para manejar archivos
  10.  
  11. namespace Prueba1
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         public Form1()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.  
  20.         //////////////////////////////
  21.         //Variable global
  22.         List<byte> recibido = new List<byte>();
  23.  
  24.         //////////////////////////////
  25.         //Abrir puerto COM14
  26.         private void button1_Click(object sender, EventArgs e)
  27.         {
  28.             PuertoSerie1.Open();
  29.             recibido.Clear();
  30.         }
  31.  
  32.         //////////////////////////////
  33.         //Datos en el buffer
  34.  
  35.         private void PuertoSerie1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  36.         {
  37.             int bytes = PuertoSerie1.BytesToRead;
  38.  
  39.             byte[] buffer = new byte[bytes];
  40.  
  41.             PuertoSerie1.Read(buffer, 0, bytes);
  42.             foreach (byte elem in buffer)
  43.             {
  44.                 recibido.Add(elem);
  45.             }
  46.         }
  47.     }
  48. }
  49.  

Una duda es, ¿como puedo manipular cada elemento?, por ejemplo, que el cuadro de texto muestre lo que llega por el puerto, que el usuario al escribir y al darle al botón, se guarde el string y se envíe por puerto serial......para así entonces poder entender como manejar cada función.

Gracias!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #25 en: 02 de Octubre de 2009, 13:33:53 »
Hola, para que el cuadro de texto muestre el string debes armar un string y pasárselo a la propiedad .Text.

Código: [Seleccionar]
String cadena = "Datos: " + dato;
txtCadena.Text = cadena;

Si tienes dudas con lo básico de C# talvez sea mejor que estudies algún tutorial sencillo de C# en la web  ;-)

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #26 en: 06 de Diciembre de 2009, 01:56:54 »
Hola, antes que nada quería agradecer a migsantiago por la info útil que subió.
Ahora, a ver si me pueden dar una manito con algo que soy principiante en c#. Cuando recibo datos por el puerto serie salto al handler de recepción pero si quiero modificar un textbox me salta una excepción, correspondiente a que varios hilos (thread) tratan de modificar el mismo textbox.
Si controlo las excepciones con try-catch no salta la excepción pero el textbox no se actualiza hasta que no paso el mouse por arriba.

 

Código: C#
  1.         private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  2.         {
  3.             int bytes = serialPort1.BytesToRead;
  4.             byte[] buffer = new byte[bytes];
  5.             serialPort1.Read(buffer, 0, bytes);
  6.             bool box16;
  7.  
  8.  
  9.             try
  10.             {
  11.        
  12.  
  13.                 switch ((char)buffer[0])
  14.                 {
  15.                     case '0':
  16.                         if (checkBox16.Checked == true) box16 = false;
  17.                         else
  18.                         {
  19.  
  20.                             box16 = true;
  21.  
  22.  
  23.                         }
  24.                         //serialPort1.DiscardInBuffer();
  25.                         if (box16 == true) checkBox16.Checked = true;
  26.                         else checkBox16.Checked = false;
  27.                        
  28.  
  29.                         break;
  30.  
  31.  
  32.                 }
  33.             }
  34.             catch (Exception ex)
  35.             {
  36.                 //MessageBox.Show("hola".ToString());
  37.                
  38.                 //checkBox16.Checked = true;
  39.  
  40.        
  41.                 return;
  42.             }
  43.  
  44.         }
  45.  

abrazo.-

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #27 en: 06 de Diciembre de 2009, 10:31:01 »
Hola, leo tu código pero no encuentro nada que hable de una textbox, solo de una checkbox.  :huh:

Si declaraste varios threads entonces deberás mantener la textbox con una variable global o algún semáforo que te permita escribirla solo cuando otro no esté manipulándola.

Código: [Seleccionar]
//Variable global
Boolean semaforo = false;

//Código en thread1
while(semaforo==true)
   Thread.Sleep(10); //Espera 10ms a que thread2 pierda control de textbox
   semaforo=true;
   textbox.Text = "Thread1 bajo control de textbox";
   semaforo = false;



//Código en thread2 que imagino es la atención al event serialport_DataReceived
        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);
            
while(semaforo==true)
   Thread.Sleep(10); //Espera 10ms a que thread1 pierda control de textbox
   semaforo=true;
   textbox.Text = "Thread1 bajo control de textbox";
   semaforo = false;
        }

Algo así podrías hacer.
« Última modificación: 06 de Diciembre de 2009, 10:36:52 por migsantiago »

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #28 en: 06 de Diciembre de 2009, 15:15:36 »
Gracias migsantiago,
no lees nada de textbox porque me equivoque, quise poner checkbox en su lugar. Disculpa, lamento el error.
De todas formas entiendo lo que me decís de los semáforos y creo que lo voy a poder solucionar por ese lado.

Nuevamente te estoy muy agradecido, sos un groso.
Abrazo.-



Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #29 en: 06 de Diciembre de 2009, 15:22:42 »
jeje

A ver si cuando quede nos ayudas con el asunto de los threads porque quiero aprender a usarlos.


 

anything