Actualmente estoy escribiendo una aplicación que se comunica con un servo integrado a través de una conexión en serie.Método más rápido de subprocesamiento múltiple del puerto serie Análisis de datos C#
El motor envía datos de posición a una velocidad de hasta 1000 veces/segundo. Lo que estoy tratando de lograr es poder formatear los datos que regresan (despojándolos de espacios en blanco, nuevas líneas, etc.) y analizarlos para extraer los datos relevantes de las cadenas recibidas.
Actualmente, tengo el manejador de eventos de datos recibidos, leen los datos, los formatean usando una serie de llamadas al método string.replace, y lo añaden a una cadena que actúa como un buffer. Luego, usando hilos, reviso constantemente el buffer mientras se llena para un delimitador particular (en mi caso "\ r") que significa el final de un mensaje del motor, luego quito ese mensaje del buffer y lo imprimo a un rico campo de texto.
Hay dos problemas con este enfoque. Una es que debido a que el motor transmite datos de posición a una velocidad tan alta, la memoria intermedia se llena más rápido de lo que los hilos pueden procesar los datos. Por lo tanto, cuando envío un comando al motor, actúa de inmediato, pero la respuesta se demora unos segundos porque todos los datos anteriores en el buffer deben procesarse primero. En segundo lugar, tener dos hilos que ejecutan un método que implementa una estructura while (verdadera) significa que la utilización del procesador se dispara y en pocos segundos los ventiladores en la PC están en máx.
¿Existe una forma mejor de manejar los datos?
Aquí está mi código de controlador de eventos:
//data recieved event handler
private void dataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string tmp;
tmp = sp.ReadExisting();
//cut out any unnecessary characters
tmp = tmp.Replace("\n", "");
tmp = tmp.Replace(",", "\r");
tmp = tmp.Replace(" ", "");
lock (this)
{
//put all received data into the read buffer
readBuffer += tmp;
}
}
Aquí es el método que los hilos se ejecutan:
private void parseBuffer()
{
while (true)
{
//obtain lock, parse one message from buffer
lock (this)
{
if (readBuffer.IndexOf("\r") > 0)
{
String t = readBuffer.Substring(0, readBuffer.IndexOf("\r") + 1);
readBuffer = readBuffer.Replace(t, "");
dataReady(this, new CustomEventArgs(t, null));
}
}
}
}
He encontrado el problema. No es que el programa no pueda procesar los datos en el búfer lo suficientemente rápido, es que el programa no puede escribir en el cuadro de texto enriquecido lo suficientemente rápido. El código que estaba usando solo hizo algo como 'textBox1.text + = myText; '. Al imprimir en la consola, no tengo problemas con el almacenamiento intermedio que crece más rápido de lo que el programa procesa los datos como dije anteriormente. – isometrik