2012-01-09 14 views
6

Intenté buscar en Google esto, no pude encontrar una respuesta, busqué aquí, no pude encontrar una respuesta. ¿Alguien ha investigado si es seguro escribir en un objeto Serial() (pyserial) desde el hilo a y hacer lecturas de bloqueo desde el hilo b?pyserial - es posible escribir en el puerto en serie desde el subproceso a, doblo las lecturas desde el subproceso b?

Sé cómo utilizar primitivas de sincronización de subprocesos y estructuras de datos seguros para subprocesos, y de hecho mi forma actual de este programa tiene un hilo dedicado a lectura/escritura en el puerto serie y uso estructuras de datos seguras para la rosca para coordinar actividades en la aplicación.

Mi aplicación se beneficiaría enormemente si pudiera escribir en el puerto serie desde el hilo principal (y nunca leer de él) y leer desde el puerto serie usando lecturas de bloqueo en el segundo hilo (y nunca escribir en él). Si alguien realmente quiere que investigue por qué esto beneficiará a la aplicación, puedo agregar mis razones. En mi opinión, solo habría una instancia de Serial() e incluso mientras el hilo B se encuentra en una lectura de bloqueo en el objeto Serial, el hilo A sería seguro para usar métodos de escritura en el objeto Serial.

¿Alguien sabe si la clase Serial se puede utilizar de esta manera?

EDITAR: Se me ocurre que la respuesta puede depender de la plataforma. Si tiene alguna experiencia con una plataforma como esta, sería bueno saber en qué plataforma estaba trabajando.

EDITAR: Solo ha habido una respuesta, pero si alguien más ha intentado esto, por favor deje una respuesta con su experiencia.

Respuesta

11

He hecho esto con pyserial. Leer de un hilo y escribir de otro no debería causar problemas en general, ya que no existe realmente ningún tipo de problema de arbitraje de recursos. Los puertos serie son full dúplex, por lo que la lectura y la escritura pueden ocurrir de forma completamente independiente y al mismo tiempo.

+0

¿Estaba utilizando PySerial? ¿Y en qué plataformas funcionó con éxito? –

+0

Estaba usando PySerial en Windows, pero no puedo imaginar por qué no funcionaría en ninguna plataforma. – TJD

+0

¡Gracias por compartir tu experiencia! –

3

He usado pyserial de esta manera en Linux (y Windows), ¡sin problemas!

0

Recomendaría modificar el hilo B de "lectura bloqueada" a "lectura/escritura no bloqueante". El hilo B se convertiría en su puerto serie "Daemon".

El subproceso A podría funcionar a toda velocidad para una interfaz de usuario amigable o realizar cualquier operación en tiempo real.

El subproceso A escribiría un mensaje en el subproceso B en lugar de intentar escribir directamente en el puerto serie. Si el tamaño/frecuencia de los mensajes es bajo, funcionaría un búfer compartido simple para el mensaje y un indicador para indicar que hay un mensaje nuevo. Si necesita un mayor rendimiento, debe usar una pila. Esto se implementa simplemente con una matriz lo suficientemente grande como para acumular muchos mensajes para enviar y dos punteros. El puntero de escritura solo se actualiza con el subproceso A. El puntero de lectura solo se actualiza con el subproceso B.

El subproceso B captará el mensaje y lo enviará al puerto serie. El puerto serie debe usar la función de tiempo de espera para que la función de puerto serie de lectura libere la CPU, lo que le permite sondear el búfer compartido y, si hay algún mensaje nuevo, enviarlo al puerto serie. Yo usaría un sueño en ese momento para limitar el tiempo de CPU utilizado por el Subproceso B. Luego, puede hacer que el Subproceso B bucle sea leído en la función de puerto serie. Si el tiempo de espera del puerto serie no funciona bien, como si el cable USB-RS232 se desconectara, la función de reposo marcará la diferencia entre un buen código de Python y uno no tan bueno.

+4

El objetivo del enfoque de dos hilos es que no necesita tener un sondeo en ninguna parte, ya que el hilo del lector solo bloquea en el rcv. – mikepurvis

Cuestiones relacionadas