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:
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
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
0