none
Enviar letra que pulso desde un punto a otro RRS feed

  • Pregunta

  • Hola:

    En un Form, tengo un textBox y nada más.

    En el TextBox1, desde que pulse cualquier letra en el teclado, escribirá dicha letra dicho textBox1 como hace siempre. Desde que detecte una letra, lo envía al puerto serie.

    ¿Alguna idea?

    Saludos.

    PD: Uso Visual Studio Community 2017.

    PD: Con ansias de probar el nuevo la versión 2019, aqn queda esperar, ejjejeje.

    http://electronica-pic.blogspot.com

    domingo, 30 de diciembre de 2018 9:28

Respuestas

  • Tal como lo has hecho, estás enviando el texto completo cada vex que pulsan una letra. Es decir, pulsan la H y se envía H. Pulsan la o y se envía Ho. Pulsan la l y se envía Hol. Por lo tanto, lo que transmite el puerto si teclean "Hola" es "HHoHolHola". Por eso te decía yo que enviases solo el último carácter del .Text

    byte[] mBuffer = Encoding.ASCII.GetBytes(textBox1.Text.SubString(textBox1.Text.Length-1, 1)); 

    Por cierto, una sugerencia (no para aquí sino para otros sitios donde te ocurra lo mismo): No tiene sentido poner ...Text.ToString(). El .Text ya es un String. No sirve para nada tomar un String y convertirlo en String.

    • Marcado como respuesta Metaconta miércoles, 2 de enero de 2019 22:58
    lunes, 31 de diciembre de 2018 14:27

Todas las respuestas

  • El Textbox tiene un evento llamado TextChanged. Desde ahí puedes leer el .Text del textbox, que te indica el texto completo. La última letra que teclearon será el último carácter del string... a no ser que el usuario retroceda en pantalla y teclee una letra en medio del string, o borre alguna de las letras. ¿Tienes definido qué es lo que quieres enviar al puerto serie si hacen eso?

    En fin, el caso es que una vez que tienes la última letra del string, basta con que uses la clase SerialPort para enviarla al puerto serie.

    Si tienes dudas en alguna de las dos partes (cómo separar la última letra de un string, o cómo se usa la clase SerialPort), entonces conviene que menciones en tu pregunta cuál es el lenguaje de programación que utilizas, y de qué tipo de aplicación se trata (p.ej., winforms, wpf, etc) para poderte poner un ejemplo. No basta con decir que utilizas Visual Studio Community, ya que el Visual Studio Community soporta múltiples lenguajes y tipos de aplicación.


    domingo, 30 de diciembre de 2018 14:14
  • Hola:

    Trabajo con el Windows Form en el lenguaje C#.

    Desde que el textBox detecte una letra por ejemplo la H.

    Se envía esa H, y se queda escrito en el textBox.

    Si ahora escribes la letra o. Se envía esa o y en el textBox aparece la palabra Ho.

    Si escribes la letra l, envía la letra l y en el textBox tiene escrito Hol.

    Si escribo la letra a en el textBox, envía dicha letra a y en el textBox aparece Hola.

    Según voy enscribiendo, se va enviando letra por letra por cada tecla que pulse. Un ejemplo del puerto serie para enviar datos es este.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    using System.IO.Ports; // No olvidar.
    
    namespace Arduino_Led
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientras se ejecuta esta aplicación.
                if(!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void button_Encender_Click(object sender, EventArgs e)
            {
                byte[] mBuffer = Encoding.ASCII.GetBytes("Led_ON"); // Led_ON.
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
            }
    
            private void button_Apagar_Click(object sender, EventArgs e)
            {
                byte[] mBuffer = Encoding.ASCII.GetBytes("Led_OFF"); // Led_OFF.
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
            }
        }
    }

    El código de arriba enviar datos completos con un botón. Esa parte no interesa en ese momento, solo hacer el código como te indico de los  textBox.

    Saludo.


    http://electronica-pic.blogspot.com


    • Editado Metaconta lunes, 31 de diciembre de 2018 7:20
    domingo, 30 de diciembre de 2018 22:44
  • Desde que el textBox detecte una letra por ejemplo la H.

    Se envía esa H, y se queda escrito en el textBox.

    Si ahora escribes la letra o. Se envía esa o y en el textBox aparece la palabra Ho.

    Si escribes la letra l, envía la letra l y en el textBox tiene escrito Hol.

    Si escribo la letra a en el textBox, envía dicha letra a y en el textBox aparece Hola.

    Bien, eso es muy bonito, pero ¿y si pasa esto?:

    El usuario escribe la H. Se envía la H.

    El usuario se equivoca y escribe una l. Se envía la l.

    Se da cuenta de que se ha equivocado, retrocede en el textbox, y escribe una o. ¿Quieres que se envíe la o? Los datos enviados por el puerto serían "Hlo" pese a que en pantalla se ve "Hol" en el textbox. ¿Es eso lo que quieres?

    Si presumimos que el usuario nunca se equivoca y siempre escribe los datos perfectamente correctos en el orden correcto, entonces puedes hacer lo que te dije antes: Transmite siempre el último carácter del textbox cada vez que se dispare el TextChanged. Con eso funcionaría.

    Pero si no podemos presumir esa perfección, entonces hay que definir mejor qué es lo que quieres que suceda cuando el usuario haga algo similar a lo descrito arriba.

    lunes, 31 de diciembre de 2018 7:35
  • Bueno días:

    Ese ejemplo que indicas lo haré con otro ejemplo, la idea que quiero hacer es esa, la que indico.

    Siguiendo el tema, por ahora he hecho esto.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports; // No olvidar.
    
    namespace Enviar_textos_al_LCD_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientras se ejecuta esta aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                byte[] mBuffer = Encoding.ASCII.GetBytes(textBox1.Text.ToString()); // Enviar letras.
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
            }
        }
    }
    

    No creo que sea la manera correcta pero por saber...

    http://electronica-pic.blogspot.com

    lunes, 31 de diciembre de 2018 11:27
  • Tal como lo has hecho, estás enviando el texto completo cada vex que pulsan una letra. Es decir, pulsan la H y se envía H. Pulsan la o y se envía Ho. Pulsan la l y se envía Hol. Por lo tanto, lo que transmite el puerto si teclean "Hola" es "HHoHolHola". Por eso te decía yo que enviases solo el último carácter del .Text

    byte[] mBuffer = Encoding.ASCII.GetBytes(textBox1.Text.SubString(textBox1.Text.Length-1, 1)); 

    Por cierto, una sugerencia (no para aquí sino para otros sitios donde te ocurra lo mismo): No tiene sentido poner ...Text.ToString(). El .Text ya es un String. No sirve para nada tomar un String y convertirlo en String.

    • Marcado como respuesta Metaconta miércoles, 2 de enero de 2019 22:58
    lunes, 31 de diciembre de 2018 14:27
  • byte[] mBuffer = Encoding.ASCII.GetBytes(textBox1.Text.SubString(textBox1.Text.Length-1, 1)); 

    Por cierto, una sugerencia (no para aquí sino para otros sitios donde te ocurra lo mismo): No tiene sentido poner ...Text.ToString(). El .Text ya es un String. No sirve para nada tomar un String y convertirlo en String.

    Entenido.

    Ya puse tu código, voya  probarlo y te comento si funciona.

    Gracias por explicar lo del Text.ToString(), en Internet como lo hacían, seguía su ejemplo.


    http://electronica-pic.blogspot.com

    lunes, 31 de diciembre de 2018 16:14