serial minicom mac check c++ macos plugins serial-port ioctl

c++ - minicom - serial port monitor osx



¿Cómo puedo configurar el RTS con ioctl() en un complemento de Mac? (2)

Puedo configurar el RTS con ioctl en una aplicación de Terminal pequeña, pero no en el código de mi complemento de Mac, aunque ambos ejecutan el mismo código. En el complemento solo puedo "obtener" las banderas / pines de los puertos serie, pero no "establecerlos". En la aplicación Terminal, puedo "obtenerlos y" configurarlos. Obtengo un error de ENODEV. El número de error es 19 y el mensaje es "Operación no admitida por el dispositivo".

Si se trata de un problema de seguridad (estar en el contexto de un navegador), ¿hay alguna forma de obtener permiso para modificar el indicador con ioctl? Tengo un dispositivo serie conectado a un puerto usb. Estoy usando el controlador FTDI vcp (puerto com virtual). Todo liso en el lado de Windows. Por cierto, obtengo el mismo resultado usando Safari y Firefox. A continuación se muestra mi código:

int disableRTS () { char fd, ret, flags; // open device if ((fd = open("/dev/cu.mydevice", O_RDWR | O_NDELAY)) < 0) { fprintf(stderr, "failed to open device"); return -1; } // Get the current state of the bits ioctl(fd, TIOCMGET, &flags); fprintf(stderr, "Flags are %x./n", flags); flags &= ~TIOCM_RTS; // Disable the RTS bit ret = ioctl(fd, TIOCMSET, &flags); if (ret == -1) fprintf(stderr, "TIOCMSET failed/n"); else fprintf(stderr, "TIOCMSET succeeded. flags: %x./n", flags); return 0; }

=========

Actualizar

Si actualizo la página del navegador, forzando que el código se ejecute de nuevo, ioctl () devuelve 0, lo que indica éxito. Desafortunadamente, la necesito para trabajar la primera vez. Incluso si escribo un bucle y me detengo momentáneamente, usando el método usleep () y hago intentos subsiguientes, falla. Pero entonces, cuando lo refresco lo consigue. También he duplicado el problema en un segundo proyecto, exclusivo de NPAPI "BasicPlugin.xcodeproj", suministrado por Mozilla. Mi primer proyecto de plugin es un proyecto Firebreath. Ambos fallan al principio, luego tienen éxito en la recarga de la página. También tengo 2 aplicaciones separadas para Mac que funcionan correctamente. Uno es SerialTools, y utiliza el mismo método exacto para configurar RTS (y DTR) como la aplicación my Terminal y los complementos.

========

Actualización 2

He podido obtener soporte de Apple a nivel de código para esto, por lo que podría surgir una solución. El ingeniero dijo que era "extraño" que el código se ejecute de forma diferente en un complemento que fuera de uno, y está hablando con los ingenieros del complemento de Safari.


La respuesta es que siempre que se utilice TIOCMSET o TIOCMGET en una llamada a ioctl (), el tercer parámetro debe ser un int. Yo estaba usando un char. Duh No puedo creer que me haya perdido esto. TIOCMSET y TIOCMGET se definen de la siguiente manera:

#define TIOCMSET _IOW(''t'', 109, int) /* set all modem bits */ … #define TIOCMGET _IOR(''t'', 106, int) /* get all modem bits */

y, por lo tanto, no es difícil imaginar que el uso de un carácter como el tipo para mis "flags" var podría causar un comportamiento impredecible.


Puede crear un complemento de AppleScript, que se ejecutará automáticamente en determinados momentos o durante su inicio de sesión, o continuamente en segundo plano.

AppleScript puede ejecutar código de terminal. Por lo tanto, puede hacer que se ejecute automáticamente el código get / set que actualmente ejecuta en Terminal.

El código para el complemento de AppleScript será algo como esto:

tell application "Finder" display dialog explanation buttons {"GET", "SET"} default button "GET" if result = {button returned:"GET"} then tell application "Terminal" set status to (do shell script "terminal code for getting the RTS here") end tell else if result = {button returned:"SET"} then tell application "Terminal" set status to (do shell script "terminal code for setting the RTS here") end tell end if end tell