Enviar varios comandos al puerto serie y esperar respuesta antes de enviar otro

programación


Hola a todos,

Busque ayuda sobre los datos del puerto serie recibidos.

Tengo un archivo almacenado con varios comandos.
Necesito enviar el comando uno por uno al puerto serie y esperar la respuesta y la pantalla para continuar enviando el otro comando.

Estoy usando thread.sleep entre cada envío de comando pero no funciona.

por favor ayuda.

Gracias

Lo que he probado:

I'm using thread.sleep between each command send but it does not work. 

Solución 1

Deja de jugar con Thread.Sleep: probablemente no te ayude.
La forma en que lo haría es configurar una cola de comandos y usar el evento DataReceived para obtener la respuesta. Cuando se complete la respuesta, retire el siguiente comando de la cola, envíelo y deje que el evento DataReceived procese su respuesta cuando llegue.
Cuando la cola está vacía, el conjunto de comandos está completo.

Solución 2

En general, todas las operaciones de IO asincrónicas deben realizarse en subprocesos propios para evitar bloquear la aplicación. De lo contrario, tendrá retrasos en la GUI o, en el peor de los casos, la GUI se bloqueará por completo.

Para su caso, necesitaría al menos un hilo para recibir respuestas y transmitir los comandos en cola.

El hilo receptor debe almacenar en búfer los datos hasta que se haya recibido una respuesta completa. La forma de hacerlo depende de los datos (por ejemplo, avance de línea con datos de texto o después de recibir el número de bytes que se ha anunciado en un encabezado de protocolo).

Una vez que se ha recibido una respuesta completa, esto se indica a otros hilos. En su caso, este será el hilo principal (GUI) para mostrar la respuesta y la cola de transmisión para permitir el envío del siguiente comando. Tenga en cuenta que pasar datos de un hilo a elementos de la GUI requiere un tratamiento especial.

El hilo de transmisión puede simplemente enviar usando una llamada de bloqueo porque tiene que esperar de todos modos. Después del envío tiene que esperar la señal de respuesta recibida.

Puedes poner el envío y la recepción en uno o dos hilos.

Pseudocódigo para recibir (asumiendo datos de texto):

C#
// Check for kill (terminate thread) event (wait with no timeout)
while (!KillEvent)
{
    do 
    {
        // Blocking call until a character is available
        // Should have a timeout and corresponding handling (break here)
        rxChar = ReceiveChar();
        Buffer += rxChar;
    }
    while (rxChar != '\n');
    // Signal other threads that a response has been received
    // Pass a copy of Buffer to the main thread for display
}

En el hilo de transmisión, después de enviar un comando, llame a lo anterior o espere el evento cuando la recepción se realice en un hilo propio.

Usar hilos y eventos a los que evitas llamar sleep que generalmente debe evitarse y garantizar que no se pierda tiempo del sistema.

Solución 3

Mi SerialDevice clase aquí:
Comunicación multiproceso para interfaces GPIB/Visa/Serial[^]

implementa exactamente el proceso descrito en la Solución 2 anterior: con comandos asincrónicos, la E/S se realiza en un subproceso separado que utiliza llamadas de bloqueo simples para escritura/lectura.

Un comentario sobre la solución 1: el evento DataReceived se llama en un subproceso que no es de UI, por lo tanto, necesita aprender algo sobre subprocesos de todos modos si desea usarlo (por ejemplo, el controlador DataReceived puede llamar a una devolución de llamada sincronizada para evitar problemas con campos compartidos o Componentes de la interfaz de usuario).

Solución 4

Entre tanto, descubrí una solución sin utilizar el controlador DataReceived.
Simplemente escriba el comando en el puerto serie y luego lea la respuesta del puerto serie después de la escritura.
y está funcionando según lo que estoy buscando.

Pero no estoy seguro de si esta es la forma correcta de hacerlo.
Ejemplo:
Escribir();
Leer();

コメント

タイトルとURLをコピーしました