He configurado un SerialDataReceivedEventHandler, con un programa basado en formularios en VS2008 express. Mi puerto serie está configurado de la siguiente manera:C# .Net Serial DataReceived Respuesta de evento demasiado lenta para datos de alta velocidad
115200, 8N1
DTR y RTS habilitado
ReceivedBytesThreshold = 1
tengo un dispositivo que estoy interfaz con más de un Bluetooth, USB a Serial . Hyper Terminal recibe los datos muy bien a cualquier velocidad de datos. Los datos se envían regularmente en paquetes de 22 bytes de longitud. Este dispositivo tiene una velocidad ajustable a la cual se envían los datos. A velocidades de datos bajas, 10-20Hz, el siguiente código funciona muy bien, sin problemas. Sin embargo, cuando aumento la velocidad de datos más allá de 25Hz, comienza a recibir paquetes múltiples en una llamada. Lo que quiero decir con esto es que debería haber un activador de evento para cada paquete entrante. Con tasas de salida más altas, he probado el tamaño del búfer (comando BytesToRead) inmediatamente cuando se llama al evento y luego hay múltiples paquetes en el búfer. Creo que el evento se dispara lentamente y para cuando alcanza el código, más paquetes han golpeado el buffer. Una prueba que hago es ver cuántas veces se dispara el evento por segundo. En 10Hz, obtengo 10 desencadenantes de eventos, increíble. A 100 Hz, obtengo algo así como 40 desencadenantes de eventos, no es bueno. Mi objetivo para la velocidad de datos es 100HZ es aceptable, se prefiere 200Hz y 300Hz óptimo. Esto debería funcionar porque incluso a 300Hz, eso es solo 52800bps, menos de la mitad de la velocidad establecida de 115200 baudios. ¿Algo que esté buscando?
public Form1()
{
InitializeComponent();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(Display_Results));
}
private void Display_Results(object s, EventArgs e)
{
serialPort1.Read(IMU, 0, serial_Port1.BytesToRead);
}
Intenté eliminar la llamada Invoke() y leer los datos directamente en el evento DataReceived() con los mismos resultados. Lamento ser un poco ingenuo, pero ¿podría decirme más acerca de cómo se hace la cola y por qué eso funciona más rápido? Gracias por la ayuda. – Matthew