macos - for - serial terminal mac
La funciĆ³n open() se cuelga(nunca vuelve) al intentar abrir el puerto serie en Mac OS X (1)
Me he encontrado con un problema donde la función de abrir nunca regresa cuando trato de abrir un puerto serie. No sucede todo el tiempo, y el problema desaparece por un tiempo si desconecto mi adaptador USB a serie y lo vuelvo a enchufar. Mi código se ve así:
fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);
donde bsdPath es /dev/cu.KeySerial1. Intenté agregar la opción O_NONBLOCK al comando abrir, pero aún se cuelga.
Por supuesto, me gustaría entender por qué está sucediendo esto. Mi creencia es que cualquiera que sea el problema, con O_NONBLOCK especificado, open debería regresar sin importar lo que ocurra, incluso si no se pudo abrir el puerto. Si no puede abrir el puerto, fileDescriptor debería ser -1 y se debería establecer errno (lo verifico inmediatamente después de abrir la llamada). Por supuesto, esto no está sucediendo. ¿Mi suposición es incorrecta? ¿Hay algún motivo conocido para que open () nunca regrese, incluso con O_NONBLOCK especificado cuando se encuentra un error?
Utilizando la última versión del controlador Prolific PL-2303 con un adaptador serie a USB basado en PL-2303 en 10.7.2, he podido reproducir este problema nuevamente hoy. Algunas notas:
- Cuando se cuelga en la llamada a
open()
, el proceso no se puede interrumpir mediante el comando-. (control-C). - Al ejecutar
ps -avx
muestra un código de estado de proceso de U para el proceso. No estoy seguro de lo que significa este código. No aparece en las páginas man paraps
encontradas por Google. No hay una lista de códigos de estado de proceso en la página man paraps
en mi máquina. Tal vez es específico para la versión Mac (10.4+?) Deps
? - Noté que en la ejecución inmediatamente anterior a la primera aparición de este problema, mi llamada a
ioctl()
para restablecer las opciones en el puerto volvía a su estado antes de que las cambiara para usarlas en mi programa. Tuve que matar el programa (a través del depurador de Xcode). Inmediatamente después de esto, en el siguiente lanzamiento del programa,open()
colgó ...
El problema es probable en el controlador del dispositivo. Tiene razón sobre cómo debe comportarse O_NONBLOCK
, pero depende del controlador implementarlo correctamente. Sería útil saber qué versión de OS X y qué dispositivo de USB a serie se está utilizando.
Los procedimientos estándar serían asegurarse de que el dispositivo esté enchufado directamente en los puertos USB de la CPU (no en un concentrador), verificar los cables y verificar si hay controladores actualizados.
Además, cuando open()
está bloqueando, ¿es el proceso interrumpible por control-c? Si observa el proceso con " ps -aux
" mientras está bloqueado, ¿qué dice el campo " STAT
"?