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

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

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #60 en: 29 de Julio de 2010, 19:20:34 »
Puede ser que cerras el archivo, pero despues no lo volves a abrir. Por ahi te puede convenir abrir el archivo en el metodo de resepción del port serie.

Código: C
  1.  
  2. private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  3. {
  4.   StreamWriter ARCHI = new StreamWriter(@"c:\\archivos1\\paso.txt", true);    // abre archivo
  5.   .
  6.   .
  7.   .
  8.  ARCHI.close();
  9. }
  10.  

Desconectado bib22jason

  • PIC10
  • *
  • Mensajes: 2
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #61 en: 30 de Julio de 2010, 14:39:21 »
Hola de nuevo!!!

alexysar, mira que me di cuenta que mi problema no es el guardado de datos en un archivo de texto, mi problema se basa en que despues de que recibo una trama de byte, y luego recibo otra trama de bytes, en ese momento se cierra el programa y esa partes es la que no entiendo el por que, ni como solucionarlo, si puedieran echarme la mano se los agradeceria.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1689
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #62 en: 30 de Septiembre de 2010, 23:54:05 »
hola a todos, no se si la pregunta esta en el hilo correcto, lo q pasa es que en este momento no tengo entrenadora y no tengo nada de hard para ensayar y retomar a c#, entonces lo que quiero saber es si el siow o algun otro programa me serviría para emular o hacer puertos COM virtuales (escribir y recibir) en el portatil mientras corro mi programa en c#?
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #63 en: 01 de Octubre de 2010, 08:46:24 »
el siow no lo conozco. Yo uso el Virtual Com para eso. La idea es que este programita te genera dos com virtuales que tienen una conexión de loop back interna. Por ejemplo genera el com 10 y 20 que son virtuales y estan conectados por loop back. Entonces el software que hago en c# lo conecto al com 10, y el com 20 lo conecto al hyperterminal. Asi, todo lo que mandamos desde c# al com 10 sale por el hyperterminal, y todo lo que mandemos por el hyperterminal lo recibe C#.
Espero que te sea útil.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #64 en: 01 de Octubre de 2010, 10:37:29 »
hola a todos, no se si la pregunta esta en el hilo correcto, lo q pasa es que en este momento no tengo entrenadora y no tengo nada de hard para ensayar y retomar a c#, entonces lo que quiero saber es si el siow o algun otro programa me serviría para emular o hacer puertos COM virtuales (escribir y recibir) en el portatil mientras corro mi programa en c#?

Hola. Mientras esté enlistado en el administrador de dispositivos de Windows podrás usarlo como cualquier puerto COM sin importar si es real o virtual.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1689
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #65 en: 01 de Octubre de 2010, 14:08:19 »
gracias, efectivamente he podido enviar datos desde C# hacia el programa Terminal de Bray,  no he podido visualizar en c# lo que recibo desde Terminal de Bray. Con el virtual serial port driver he creado un par de puertos el COM4 y COM5 en loop back.  COM4 para C# y COM5 para Terminal. Entonces lo que trato de hacer es poner en un label lo que reciba del COM5, asi:
Código: [Seleccionar]
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string dato;
            int bytes = serialPort1.BytesToRead;
            byte[] buffer = new byte[bytes];
            serialPort1.Read(buffer, 0, bytes);
           
            dato = Convert.ToString(buffer[0]);
            label1.Text(dato);
       
        }


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 #66 en: 01 de Octubre de 2010, 16:55:44 »
La última línea:

Código: [Seleccionar]
label1.Text = dato;

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1689
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #67 en: 01 de Octubre de 2010, 22:39:18 »
ya corregi pero sigue sigue igual... :huh: :huh:
aparece "Operación no válida a través de subprocesos: Se tuvo acceso al control 'label1' desde un subproceso distinto a aquel en que lo creó."
« Última modificación: 01 de Octubre de 2010, 23:12:00 por jhozate »
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 #68 en: 02 de Octubre de 2010, 14:43:43 »
Prueba guardando el dato recibido en un string de acceso global.

Después con un timer refresca la label de la form leyendo el contenido del string global.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1689
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #69 en: 02 de Octubre de 2010, 18:14:34 »
si, gracias, asi quedó bien, aunque me venia confundiendo en cómo declarar una variable global en c# porque encontré que hay que hacer una clase y declarlas ahi, pero las declare en este clase y funciona
Citar
public partial class Form1 : Form
    {
        string dato;
        int bytes;
        public byte[] buffer;

en la ayuda me indica que debo declarar las variables asi
Citar
namespace YourNamespace
{
    class YourClass
    {
    }
pero asi no me funciona  :huh:

entonces, ya logré visualizar lo que envio desde el COM5 en el label, a lo mejor estoy confundido, pero si envio desde mi COM5(Termina de bray) el 1 lo que veo en el label es el 49 (ASCII 1) y No el 1...y no se supone que con hacer
Código: [Seleccionar]
label1.text=convert.tostring(dato);deberia ver el 1??  :huh:
« Última modificación: 02 de Octubre de 2010, 18:16:47 por jhozate »
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 #70 en: 02 de Octubre de 2010, 20:25:50 »
Sí, debes familiarizarte más con la prog. orientada a objetos.

Sobre la conversión, así la puedes hacer:

Código: [Seleccionar]
String s = System.Text.ASCIIEncoding.ASCII.GetString(buffer);

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1689
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #71 en: 02 de Octubre de 2010, 23:16:24 »
nada  :? :oops: :( este es el codigo que tengo
me sale que no se puede convertir string a byte, y que la instruccion de conversion a ASCII  tiene argumentos no validos

Código: [Seleccionar]
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string dato;
        int bytes;
        byte[] buffer;
        string numero;
    
        public Form1()
        {
            InitializeComponent();
        }
            
        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Write(textBox1.Text);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            this.Close();
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
        
            bytes = serialPort1.BytesToRead;
            byte[] buffer = new byte[bytes];
            serialPort1.Read(buffer, 0, bytes);
            dato = Convert.ToString(buffer[0]);
                      
        }

        private void button4_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button4.Enabled = false;
            button3.Enabled = true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            button3.Enabled = false;
            button4.Enabled = true;

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            numero = System.Text.ASCIIEncoding.ASCII.GetString(dato);
            label1.Text = numero;
              
        }

      
    }
}



es que supongo yo que dato deberia ser un array y entonces deberia darle la direccion del array que quiero convertir...??
« Última modificación: 02 de Octubre de 2010, 23:18:26 por jhozate »
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 #72 en: 03 de Octubre de 2010, 10:17:35 »
Estás poniendo mal el dato de la función ASCII.

Te pondré más detalle en el código para que tú mismo identifiques y corrijas el error.

Código: [Seleccionar]
Byte[] buffer = new byte[] {49};

String s = System.Text.ASCIIEncoding.ASCII.GetString(buffer);

No sólo copies y pegues... analiza el código, lee la sintaxis de las funciones que te pasé y escribe tu propio código.

Desconectado Omar266

  • PIC10
  • *
  • Mensajes: 13
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #73 en: 20 de Febrero de 2015, 23:04:38 »
Hola, mi pregunta es si hay una manera de que el programa detecte los puertos disponibles en ese momento. Ya que deseo utilizar comunicación Bluetooh y cada vez que agrego un nuevo dispositivo me cambia el puerto. Como deseo correr el Omar232.exe., o de que otra manera lo pudiera hacer.
Este es parte de mi código. gracias


       #region Cambio de PUERTO, VELOCIDAD Y BITS DE PARADA
        private void combo_COM_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.Close();   //Cerrar puerto
            int selectIndex = comboBox_COM.SelectedIndex;
            Object SelectedItem = comboBox_COM.SelectedItem;
            serialPort1.PortName = SelectedItem.ToString();
            ///////////////////////////////////////////////////
            // Abrir puerto mientrase ejecute la aplicación
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                    pto_temp = selectIndex;
                }
                //catch (System.Exception ex)
                catch (System.Exception )
                {
                    if(pto_temp == 0){
                    serialPort1.PortName = "COM1";
                    comboBox_COM.Text = "COM1";
                    }
                    if (pto_temp == 1)
                    {
                        serialPort1.PortName = "COM9";
                        comboBox_COM.Text = "COM9";
                    }
                    if (pto_temp == 2)
                    {
                        serialPort1.PortName = "COM5";
                        comboBox_COM.Text = "COM5";
                    }
                    if (pto_temp == 3)
                    {
                        serialPort1.PortName = "COM6";
                        comboBox_COM.Text = "COM6";
                    }
                    if (pto_temp == 4)
                    {
                        serialPort1.PortName = "COM7";
                        comboBox_COM.Text = "COM7";
                    }
                    if (pto_temp == 5)
                    {
                        serialPort1.PortName = "COM8";
                        comboBox_COM.Text = "COM8";
                    }
                    if (pto_temp == 6)
                    {
                        serialPort1.PortName = "COM10";
                        comboBox_COM.Text = "COM10";
                    }
                    MessageBox.Show("Se ha denegado acceso al puerto. \n\n" +
                    "Si la conexión es Bluetooth, asegúrate de que el MODULO este conectado. \n" , "Aviso:",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);

                }
               
            }
            //serialPort1.Open();  // Abrir puerto
        }