none
Entender un byte recibido RRS feed

  • Pregunta

  • Hola:

    Quiero recibir un byte desde puerto serie, este debe entenderlo y ejecutar un if else. Aquí abajo hay un programa completo que envía bytes y los recibe, todo lo que recibe llega a un textBox y lo visualiza.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.IO.Ports; // Do not forget.
    
    namespace PicRS232
    {
        public partial class Form1_Principal : Form
        {
            // Use a string as the receive buffer.
            string Recibidos;
            public Form1_Principal()
            {
                InitializeComponent();
                // Open port while running the application.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
                // Run the Reception function by triggering the Event 'DataReived'.
                serialPort1.DataReceived += new
                System.IO.Ports.SerialDataReceivedEventHandler(Recepcion);
            }
            // Upon receiving the data.
            private void Recepcion(object sender, 
                    System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                // Collecting the characters received to our 'buffer' (string).
                Recibidos += serialPort1.ReadExisting();
                // Invoke or call the process of hatching.
                this.Invoke(new EventHandler(Actualizar));
            }
            // Process the data received in the full frame buffer and extract.
            private void Actualizar(object s, EventArgs e)
            {
                // Assign the value of the plot to the RichTextBox.
                richTextBox_visualizar_mensaje.Text = Recibidos;
            }
            private void button_t_Click(object sender, EventArgs e)
            {
                byte[] mBuffer = new byte[1];
                mBuffer[0] = 0x74; //ASCII letter "t".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
            }
    
            private void button_b_Click(object sender, EventArgs e)
            {
                byte[] miBuffer = new byte[1];
                miBuffer[0] = 0x62; //ASCII letter "b".
                serialPort1.Write(miBuffer, 0, miBuffer.Length);
            }
    
            private void button_a_Click(object sender, EventArgs e)
            {
                byte[] mBuffer = new byte[1];
                mBuffer[0] = 0x61; //ASCII letter "a".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
            }
    
            private void button_l_Click(object sender, EventArgs e)
            {
                byte[] mBuffer = new byte[1];
                mBuffer[0] = 0x6C; //ASCII letter "l".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
            }
    
            private void button_Espacio_Click(object sender, EventArgs e)
            {
                byte[] mBuffer = new byte[1];
                mBuffer[0] = 0x20; //ASCII letter "Space".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
            }
    
            // Show local time.
            private void timer1_Tick(object sender, EventArgs e)
            {
                statusStrip1.Items[0].Text = DateTime.Now.ToLongTimeString();
            }
    
            // We always show the message below.
            private void richTextBox_visualizar_mensaje_TextChanged(object sender, EventArgs e)
            {
                richTextBox_visualizar_mensaje.SelectionStart = 
                            richTextBox_visualizar_mensaje.TextLength;
                richTextBox_visualizar_mensaje.ScrollToCaret();
            }
        }
    }

    Una cosa que quiero hacer es, que al detectar un byte determinado, el que yo desee, en un label me ponga 1 ó 0. En el programa, ya supongo que tiene Switch y case. Dependediendo los byte que reciba, me ejecute un case o otro.

    1) Por ejemplo, me llega un byte en modo hexadecimal como este 0x61 que en ASCII es la letra a minúscula, me ejecute un case y en un label me diga 1, si me llega el byte 0x62 en el mismo label me diga 0.

    ¿Cómo se hace?

    Un cordial saludo.


    http://electronica-pic.blogspot.com

    miércoles, 23 de octubre de 2013 11:48

Respuestas

  • Hola!

    Permite que te responda con una de Lambdas en VB... pues soy MVP de VB :-)

    Si lo necesitas en C# me entretendré un rato y te lo paso.

    Dim intCharToString As Func(Of Integer, String) = Function(x As Integer) If(x = 61, "0", If(x = 62, "1", "")) MessageBox.Show(intCharToString(61)) MessageBox.Show(intCharToString(62))


    Saludos,
    PepLluis, 

     


    MVP - Visual Developer

    • Marcado como respuesta Metaconta jueves, 31 de octubre de 2013 19:08
    jueves, 31 de octubre de 2013 16:24
    Moderador

Todas las respuestas

  • Hola!

    Permite que te responda con una de Lambdas en VB... pues soy MVP de VB :-)

    Si lo necesitas en C# me entretendré un rato y te lo paso.

    Dim intCharToString As Func(Of Integer, String) = Function(x As Integer) If(x = 61, "0", If(x = 62, "1", "")) MessageBox.Show(intCharToString(61)) MessageBox.Show(intCharToString(62))


    Saludos,
    PepLluis, 

     


    MVP - Visual Developer

    • Marcado como respuesta Metaconta jueves, 31 de octubre de 2013 19:08
    jueves, 31 de octubre de 2013 16:24
    Moderador
  • Hola:

    Por lo que entiendo, es así:

    Func<int, string> intCharToString = (int x) => x == 61 ? "0" : x == 62 ? "1" : "";
    MessageBox.Show(intCharToString(61));
    MessageBox.Show(intCharToString(62));

    Saludo.


    http://electronica-pic.blogspot.com

    jueves, 31 de octubre de 2013 19:10
  • Ni mas ni menos!

    Creo que conceptualmente es mas limpio que las clásicas :

                MessageBox.Show(IntCharToString(61));
                MessageBox.Show(IntCharToString(62));
                MessageBox.Show(IntCharToString(63));
            }
    
            private string IntCharToString(int IntChar)
            { 
                switch(IntChar)
                {
                    case 61:
                        return "0";
                    case 62:
                        return "1";
                    default:
                        return "?";
                }
            }

    No crees?
    Saludos!!,

    PepLluis,


    MVP - Visual Developer

    sábado, 2 de noviembre de 2013 11:57
    Moderador