none
enviar valores por puerto serial c# RRS feed

  • Pregunta

  • hola que tal, me gustaria saber como puedo enviar un valor en una sola variable ejemplo el numero 2000 decimal por el puerto serial desde c# a un microcontrolador pic. lo que pasa es que solo puedo enviar valores de 48 a 255 en una variable, (ejemplo: envio el numero 1 del teclado (ascii) y al llegar al pic este me lo representa como un 49 decimal

     if (numero == 1)
                {

                    serialPort1.Write(Convert.ToString("1"));
                }

    viernes, 2 de mayo de 2014 22:44

Todas las respuestas

  • Tienes que leer la documentación del microcontrolador para ver cómo requiere que se le codifiquen los valores enviados. Podría ser que los requiera en ASCII, en cuyo caso tendrías que convertir tu número mediante ToString, pero puede ser que lo requiera en hexadecimal (con los bytes ordenados de mayor a menor o de menor a mayor), o incluso en binario, lo cual una vez más requiere saber el orden de los bytes.

    Si enviando un "1" (carácter) te lo interpreta como 49, significa que está interpretando en binario los datos recibidos (el carácter "1" en ASCII se codifica como 49 decimal o 31 hexadecimal). Sigue siendo necesario saber cómo espera el firmware del microcontrolador recibir los bytes cuando quieres enviar un valor más grande tal como 2000. La documentación debe especificar algún protocolo para codificar los varios bytes (dos en este caso) que pueden formar parte del número.

    sábado, 3 de mayo de 2014 6:09
  • Hola Daveor,

    El máximo valor representable sin encapsular en una comunicación serie, es 255 pues las UART se basan en la serializacion de 1 Bytes (8 Bits) encabezados por el bit de 'start' y terminados por la paridad y bits de 'stop'.

    Como bien dice Alberto, debes distinguir entre enviar Chr(1) o Chr(49) y luego decodificarlo en el PIC.

    Lo normal es intercambiar ASCII tipo "2000" (BCD) sin empaquetarlos para recibir los correspondientes 4 Bytes en el otro extremo y componerlos en un valor decimal. (rango 0-9999)

    También puedes transmitir sus equivalentes en hexadecimal.. "FFFF" y luego componerlos como un hex tipo expresión &hFFFF que representaría el valor de 65535 (rango 0-65535)

    Como ves ambas expresiones ocuparían 4 bytes.

    La otra posibilidad en transmitir dos bytes (16bits) en nibbles de alto y bajo (empaquetado) y después desempaquetarlos para componer un decimal/doble o lo que sea.. en numérico.

    Para evitar confusiones es mejor utilizar expresiones del tipo : SerialPort.Write(Chr(49)).

    Bien espero que esta info complemente la excelente explicación de Alberto.
    Saludos,
    PepLluis,

    martes, 13 de mayo de 2014 14:39
  • Hola:

    Fijatse biern la tabla ascii por cada byte enviado.

    Si quieres enviar la latra "a", este es el código, suponiendo que el puerto está abierto.

    byte[] mBuffer = new byte[1];
                mBuffer[0] = 0x61; // Letra ASCII "a".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);


    Si quieres enviar en un botón una trama de bytes.

    private void button_t_Click(object sender, EventArgs e)
    {
        byte[] mBuffer = new byte[5];
        mBuffer[0] = 0x74;
        mBuffer[1] = 0x75;
        mBuffer[2] = 0x89;
        mBuffer[3] = 0x20;
        mBuffer[4] = 0x6C;
        serialPort1.Write(mBuffer, 0, mBuffer.Length);
    }

    También de esta manera.

    private void button_b_Click(object sender, EventArgs e)
    {
        byte[] mBuffer = Encoding.ASCII.GetBytes("Hola mundo");
        serialPort1.Write(mBuffer, 0, mBuffer.Length);
    }

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 13 de diciembre de 2015 9:33