Red de conocimiento del abogados - Ley de patentes - Cómo leer y escribir datos del puerto COM del dispositivo a través de SerialPort

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;

}