2010-01-19 9 views
6

Aquí está mi problema: tengo que poder enviar y recibir a un dispositivo a través de una serie. Esto tiene que hacerse de una manera multihilo. El flujo es el siguiente:Productor/Consumidor para hablar con dispositivos en serie

  1. Espere a que el dispositivo para enviarme algo - o si está inactivo, entonces consulta de estado para ver si en línea con el dispositivo

  2. Si el dispositivo me envía algo, entonces mensaje de proceso, reconocer y decirle al dispositivo que realice otros comandos según sea necesario

Ahora mismo, tengo un hilo de recepción y un hilo de transmisión. El hilo de recepción tiene un ciclo while que sigue comprobando el puerto serie a través de ReadFile (...) para un byte. Si tengo un byte, entonces empiezo a construir mi buffer y luego analizo los datos para determinar qué se me envió.

El hilo de envío toma el siguiente comando definido por el hilo de lectura y lo envía a través de WriteFile al mismo puerto COM. La clave es que hay una relación de recepción/envío entre mí y el dispositivo.

Mi pregunta es, ¿tengo aquí un modelo de productor/consumidor anidado? Si mi hilo de recepción está consumiendo desde el dispositivo y el hilo de envío está produciendo en el dispositivo, los hilos necesitan hablar inherentemente para que estén sincronizados, ¿no? ¿Cuál es la mejor manera de sincronizar mis esfuerzos para hablar de manera eficiente y rápida con el dispositivo? Nota: Estoy usando C++ Builder 5 que tiene TThreads y puedo usar secciones críticas y mutexes.

Editar: ¡También estoy usando sondeo así que estoy abierto a usar WaitCommEvent también si esto funciona mejor!

Respuesta

1

¿Qué recursos compartes y crees que necesitas sincronizar?

Si tiene algo así como una cola entre los dos hilos, entonces ese es un modelo de productor/consumidor bastante clásico. P.EJ. Si solo tiene una lectura de hilo y luego coloca comandos en una cola mientras otro hilo se extrae de la cola, procesa el comando y escribe en el dispositivo, entonces necesita sincronizar el acceso a la cola con un mutex o semáforo.

Quizás me falta algo, pero esto solo debería complicarse si tiene varios hilos que se leen de la cola y los comandos que deben transmitirse deben mantenerse en orden. Así que trata de mantenerlo simple.

+0

Bien, pero ¿cómo sincronizo el acceso al dispositivo para que cuando estoy leyendo no escriba? Bandera global? –

+0

¿Estás seguro de que tienes que hacerlo? De ser así, puede usar un semáforo para sincronizar las operaciones de lectura/escritura. Este http://stackoverflow.com/questions/1488712/is-it-safe-to-read-and-write-to-a-serial-port-at-the-same-time-via-different-thre podría ser servicial. – Duck

Cuestiones relacionadas