Cómo leer y escribir datos del puerto COM del dispositivo a través de SerialPort
Existe una gran diferencia entre leer y escribir datos del puerto serie en SerialPort. Dado que el puerto serie no sabe cuándo llegan los datos, existen dos métodos para leer los datos del puerto serie. 1. El hilo lee el puerto serie en tiempo real; 2. Se implementa el método de activación de eventos.
Dado que la lectura en tiempo real del puerto serie por parte del hilo no es muy eficiente, un método mejor es la activación de eventos. Hay un evento DataReceived en la clase SerialPort. Cuando los datos llegan al caché de lectura del puerto serie, se activa el evento DataReceived. La propiedad SerialPort.ReceivedBytesThreshold determina cuántos datos hay en el caché de lectura del puerto serie antes de que se active el evento DataReceived. el valor predeterminado es 1.
Además, la operación del evento SerialPort.DataReceived es bastante especial. Se ejecuta en el subproceso auxiliar y no puede transmitir datos directamente al control de datos de visualización en el subproceso principal. De la siguiente manera:
SerialPort spSend; //spSend y spReceive están conectados a través de puertos serie virtuales y pueden transmitir datos entre sí.
spSend envía datos
SerialPort spReceive; //spReceive acepta datos
TextBox txtSend; //Área de envío
TextBox txtReceive; //Área de aceptación
Botón btnSend; //Botón de envío de datos
delegate void HandleInterfaceUpdateDelegate(string text); //Delegación, este es el punto clave
HandleInterfaceUpdateDelegate interfaceUpdateHandle;
public void InitClient() //El control de formulario ya se está inicializando
{
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //Crea una instancia del objeto delegado
spSend .Open(); //El objeto SerialPort debe cerrarse antes de que finalice el programa, como se explica aquí
spReceive.DataReceived = Ports.SerialDataReceivedEventHandler(spReceive_DataReceived);
spReceive.ReceivedBytesThreshold = 1;
spReceive.Open();
}
public void btnSend_Click(remitente del objeto, EventArgs e)
{
spSend.WriteLine(txtSend.Text);
}
public void spReceive_DataReceived(objeto remitente, Ports.SerialDataReceivedEventArgs e)
{
byte[] readBuffer = nuevo byte[spReceive.ReadBufferSize];
spReceive.Read(readBuffer, 0, readBuffer.Length);
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
}
UpdateTextBox privado vacío (texto de cadena)
{
txtReceive.Text = texto;
}