C sharp - Lectura del valor 63 por el puerto serie cuando el valor está comprendido entre 128 y 256

 
Vista:

Lectura del valor 63 por el puerto serie cuando el valor está comprendido entre 128 y 256

Publicado por Fernando G.L. (3 intervenciones) el 14/12/2020 19:38:31
Muy buenas a todos. Os expongo brevemente mi problema. Quiero visualizar, en una texbox de visual studio,una serie de bytes leídos por el puerto serie. Los bytes que tienen un valor menor a 127 los represento correctamente, pero a la hora de representar bytes con un valor comprendido entre 128 y 255 es cuando tengo el problema. El valor que visualizo en todo ese rango es siempre el mismo, el 63 (que corresponde con "?" en código ascii). Os comparto el código a continuación y a ver si alguien me puede ayudar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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;              // Controlar puerto serie
 
namespace Prueba
{
    public partial class Form1 : Form
    {
        // Crear una codificación UTF-8
        UTF8Encoding utf8 = new UTF8Encoding();
 
        private SerialPort serialPort1;
        string DataIN;
        long i = 0;
 
        public Form1()
        {
            InitializeComponent();
            BuscarPuertos();
        }
 
        // Buscar todos los puertos disponibles y añadirlos a la ComboBox
        private void BuscarPuertos()
        {
            string[] puertos = SerialPort.GetPortNames();
            CboPuertos.Items.Clear();
            foreach (string mostrar in puertos)
            {
                CboPuertos.Items.Add(mostrar);
            }
            if (CboPuertos.Items.Count > 0)
            {
                label2.Text = "Puertos disponibles";
            }
            else
            {
                label2.Text = "No hay puertos disponibles";
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // Limpiar ComboBox y desabilitar botones mientras no se seleccione un puerto
            CboPuertos.Text = "            ";
            BTNdesconectar.Enabled = false;
            BTNconectar.Enabled = false;
        }
 
        private void BTNconectar_Click(object sender, EventArgs e)
        {
            // Configurar puerto y conectarse
            try
            {
                serialPort1 = new SerialPort();
                serialPort1.BaudRate = 9600;
                serialPort1.PortName = CboPuertos.Text;
                serialPort1.Open();
                serialPort1.DtrEnable = true;
                BTNconectar.Enabled = false;
                BTNdesconectar.Enabled = true;
 
                serialPort1.DataReceived += serialPort1_DataReceived;
                CboPuertos.Enabled = false;
 
                label2.Text = "CONECTADO";
                label2.ForeColor = Color.Green;
                textBox1.Text = "";
            }
            catch
            {
                MessageBox.Show("El puerto seleccionado no está disponible");
            }
        }
 
        private void BTNdesconectar_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            BTNconectar.Enabled = true;
            BTNdesconectar.Enabled = false;
            CboPuertos.Enabled = true;
            label2.Text = "Puertos disponibles";
            label2.ForeColor = Color.Black;
        }
 
        // Leer lo que entra por el puerto
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            DataIN = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(showData));
            i++;
        }
        private void showData(object sender, EventArgs e)
        {
            Byte[] encodedBytes = utf8.GetBytes(DataIN);
            if (i > 0)
            {
                foreach (Byte b in encodedBytes)
                {
                    textBox1.Text += b;
                }
            }
        }
 
        private void botonsalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        private void CboPuertos_SelectedIndexChanged(object sender, EventArgs e)
        {
            BTNconectar.Enabled = true;
        }
    }
}

Tengo la TextBox donde visualizo los bytes, un ComboBox para seleccionar el puerto, unos botones para conectarme y desconectarme y un Label simplemente para indicar que estoy conectado.

Estoy probando a recibir por es puerto serie 6 bytes. Estos bytes tienen los siguientes valores respectivamente: 35 14 112 78 195 231. Los 4 primero los represento correctamente, pero los 2 últimos, cuyo valor está entre 128 y 255, los visualizo como 63.

He estado durante días buscando porqué ocurre esto e intentando hacerlo de otra manera pero no encuentro nada. No tengo mucha idea de programar en c# ni en visual studio, por lo que cualquier ayuda me vendrá bien

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 8
Ha aumentado su posición en 3 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Lectura del valor 63 por el puerto serie cuando el valor está comprendido entre 128 y 256

Publicado por Jose (3 intervenciones) el 16/12/2020 15:18:47
Puedes hacer una depuración de los valores que obtienes en estos pasos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    DataIN = serialPort1.ReadExisting();                        ********COMPRUEBA AQUÍ QUE CADENA DE TEXTO RECIBES
    this.Invoke(new EventHandler(showData));
    i++;
}
private void showData(object sender, EventArgs e)
{
    Byte[] encodedBytes = utf8.GetBytes(DataIN);
    if (i > 0)
    {
        foreach (Byte b in encodedBytes)
        {
            textBox1.Text += b;                                 *********** COMPRUEBA AQUI EL VALOR DE CADA b, sobre todo de los que fallan
        }
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lectura del valor 63 por el puerto serie cuando el valor está comprendido entre 128 y 256

Publicado por Fernando G.L. (3 intervenciones) el 16/12/2020 19:12:27
En los 2 puntos que me indicas que haga una depuración de los valores obtengo lo siguiente:

- DataIN = # \u000e p N ? ?
- b = 35 14 112 78 63 63

Los 2 bytes que recibo como ? ? los tendría que estar recibiendo como├ þ y una vez codificados se mostraría en la textbox el valor 195 y 231 respectivamente (Sé que le tienen que llegar esos valores porque los estoy enviando yo desde arduino)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 3 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Lectura del valor 63 por el puerto serie cuando el valor está comprendido entre 128 y 256

Publicado por Jose (3 intervenciones) el 24/12/2020 12:54:43
Si en DATAIN te llega esa cadena ahi es donde tienes el fallo, no se que resolución tiene esa lectura. Mira esa función porque puede que no este leyendo todo el buffer de entrada o el Arduino lo este enviando mal

Según la pagina de referencia https://docs.microsoft.com/es-es/dotnet/api/system.io.ports.serialport.readexisting?view=dotnet-plat-ext-5.0

**Este método devuelve el contenido de la secuencia y el búfer interno del SerialPort objeto como una cadena. Este método no utiliza un tiempo de espera. Tenga en cuenta que este método puede dejar bytes iniciales finales en el búfer interno, lo que hace que el BytesToRead valor sea mayor que cero.
Si es necesario cambiar entre leer texto y leer datos binarios de la secuencia, seleccione un protocolo que defina cuidadosamente el límite entre los datos de texto y binarios, como la lectura manual de bytes y la descodificación de los datos.**


Comprueba si quieres con alguna de las otras funciones a ver como las recibes, y ver si te puede resolver el problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lectura del valor 63 por el puerto serie cuando el valor está comprendido entre 128 y 256

Publicado por Fernando G.L. (3 intervenciones) el 05/01/2021 20:21:30
Gracias por contestar. Solucioné el problema cambiando ReadExisting por ReadByte, de forma que ahora el código me queda de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
12
// Leer los datos del puerto
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
   i = 0;
    dataIn = new int[20];     // El tamaño de la cadena leída es de 20 bytes
    while (serialPort1.BytesToRead > 0)
    { // Si hay datos a leer...
        dataIn[i] =  serialPort1.ReadByte(); // Leemos 1 byte.-
        this.Invoke(new EventHandler(showData));
    }
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar