我从串行端口接收数据,并将其保存在缓冲区中。然后,使用一个连续执行的线程,对缓冲区中的数据进行预处理,将其绘制出来并将其保存在另一个缓冲区中。刚开始时,它运行完美。但是一段时间之后,它开始错误地保存(绘制)数据。在图像中,我使用三角信号进行证明。
Triangular signal working fine
Triangular signal working badly
这是代码:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Leo los datos recibidos y los guardo en data
SerialPort port = (SerialPort)sender;
int largo = port.BytesToRead;
byte[] data = new byte[largo];
port.Read(data, 0, largo);
datos.AddRange(data);
}
public void ejecutarThread()
{
t = new Thread(() =>
{
while (true)
{
lock (lockMe)
{
procesarDatos();
}
}
});
t.Priority = ThreadPriority.Highest;
t.Start();
}
// Preproceso los datos guardados en la lista datos, los agrego a otra lista separados por canal y los grafico
private void procesarDatos()
{
int puntosAGraficar = Convert.ToInt32(numAGraficar.Value);
// Me guardo la cantidad de datos leidos hasta el momento
Int32 esto = leido;
Int32 cantDatosActual = Convert.ToInt32(datos.Count);
try {
adquirirSenal(adquirir);
}
catch (Exception e)
{
//MessageBox.Show("Aca la quedó");
}
}
private void adquirirSenal(bool adquirir)
{
int puntosAGraficar = Convert.ToInt32(numAGraficar.Value);
// Me guardo la cantidad de datos leidos hasta el momento
Int32 esto = leido;
Int32 cantDatosActual = Convert.ToInt32(datos.Count);
for (Int32 i = esto; i < cantDatosActual; i++)
{
// Aumento uno más porque tomo a los datos de a dos (parte baja y alta)
i = i + 1;
// Los convierto de byte a BitArray para poder operar
bitH = new BitArray(new byte[] { datos[i - 1] });
bitL = new BitArray(new byte[] { datos[i] });
int check = chequeoCanal(bitH, bitL);
// Si es canal 1
if (check == 0)
{
bitH[7] = false;
IsCanal1 = true;
contadorMuestras1 = contadorMuestras1 + 1;
}
// Si es canal 2
else if (check == 1)
{
IsCanal1 = false;
contadorMuestras2 = contadorMuestras2 + 1;
}
// Intercambio el bit 7 de la parte baja por el 2 de la parte alta
bool bitAux = bitH[2];
bitH[2] = bitL[7];
bitL[7] = bitAux;
// Lo convierto a un BitArray de 16
BitArray total = from2_8BitArrayTo1_16BitArray(bitH, bitL);
//Lo paso a entero
int val = 0;
val = getIntFromBitArray(total);
// Lo guardo en el canal correspondiente y lo dibujo
// Me fijo qué canal es segun protocolo
if (IsCanal1)
{
// Si la opcion es adquirir, me guardo los datos y luego dibujo. Sino, simplemente dibujo
if (adquirir)
guardarDatoEnLista(canal1, val);
// Grafico cada puntosAGraficar puntos para que sea en tiempo real
if ((contadorMuestras1 >= puntosAGraficar))
{
contadorMuestras1 = 0;
if (listaPuntos1.Count >= 300)
listaPuntos1.Clear();
contadorAcumulador1++;
listaPuntos1.Add(listaPuntos1.Count, Convert.ToDouble(val));
if (contadorAcumulador1 >= 3)
{
zedGraph1.Refresh();
contadorAcumulador1 = 0;
}
}
}
else if (!IsCanal1)
{
// Si la opcion es adquirir, me guardo los datos y luego dibujo. Sino, simplemente dibujo
if (adquirir)
guardarDatoEnLista(canal2, val);
// Grafico cada puntosAGraficar puntos para que sea en tiempo real
if ((contadorMuestras2 >= puntosAGraficar))
{
contadorMuestras2 = 0;
if (listaPuntos2.Count >= 300)
listaPuntos2.Clear();
contadorAcumulador2++;
listaPuntos2.Add(listaPuntos2.Count, Convert.ToDouble(val));
if (contadorAcumulador2 >= 3)
{
zedGraph2.Refresh();
contadorAcumulador2 = 0;
}
}
}
leido = leido + 2;
}
}
您没有正确接地