2009-02-03 15 views
5

Mi única forma de comunicación con mi dispositivo incorporado es un puerto en serie. Por defecto, Linux incorporado usa este puerto como terminal. ¿Cómo desactivo este terminal y uso el enlace serie para transferir datos binarios? Escuché sobre comandos como rx y tx pero no puedo encontrarlos.Datos binarios sobre el terminal en serie

Creo que puedo leer() desde y escribir() cosas en/dev/tty pero quiero asegurarme de que no haya ningún mensaje de error o cualquier otro problema con mi flujo de datos.

Respuesta

3

Puede usar una aplicación como xmodem para transferir archivos a través de cualquier terminal. Es el puerto serie que hablas desde un terminal, o también es la consola del kernel.

Si su kernel no es ruidoso, entonces puede usar su conexión actual para hacer una transferencia similar a xmodem. En el lado del host, puede usar kermit, que es bueno AND scriptable.

Si desea hacer su puerto serie en bruto, y tiene ttyfd descriptor de archivo abierto, aquí es una manera de hacerlo:

struct termios tty, orig_tty; 

... 

if(tcgetattr(ttyfd, &tty) < 0) 
{ 
    // error checking 
} 
// backup tty, make it raw and apply changes 
orig_tty = tty; 
cfmakeraw(&tty); 
if(tcsetattr(ttyfd, TCSAFLUSH, &tty) < 0) 
{ 
    // error checking 
} 

... 
//end of program or error path : 
tcsetattr(ttyfd, TCSAFLUSH, &orig_tty) 

No se olvide de restaurar la configuración al final de su programa si aún desea una buena terminal con comportamiento.

3

¿No puede simplemente configurar el terminal en bruto?

Echa un vistazo a this tutorial.

2

Puede ejecutar en el terminal un comando que transferirá los datos a través de un protocolo de nivel de aplicación. Los comandos rx y tx a los que se refiere implementan el XMODEM file transfer protocol. Podría ser una solución, si los datos binarios que desea transferir consisten en archivos, las demandas de rendimiento son bajas y no le importa la carga administrativa de ejecutar los comandos. Alternativamente, es posible que desee multiplexar el puerto serie para manejar tanto la transferencia de datos como el terminal. Deshabilite el comando del controlador del terminal serie (getty) y ejecute el protocolo PPP sobre la línea serie para establecer una conexión IP con su dispositivo. A continuación, puede iniciar sesión en el dispositivo a través de ssh o telnet y transferir sus datos a través de un socket IP.

1

Sí, todos sus puertos serie están en /dev/ttyxx. Tenga en cuenta que /dev/tty es un atajo que representa su terminal actual, no un puerto serie específico. A menudo, estos son propiedad de root y requieren que usted tenga privilegios o esté en el grupo adm para acceder al dispositivo directamente desde su aplicación.

Es posible que desee chown el dispositivo para que pueda acceder a él. No estoy seguro de cuál es la consecuencia de cambiar la propiedad del dispositivo; IIRC, es fácil de hacer y funciona muy bien. La alternativa es usar setuid para elevar su programa a un estado privilegiado.

Hay un programa llamado getty que permite a los usuarios iniciar sesión desde un puerto en serie. Su inittab comenzará en getty en puertos serie para que las personas puedan iniciar sesión.

Quiere deshabilitar getty. En algunos casos, hay un administrador de puertos que ayuda a hacer esto.

En algunos casos, puede cambiar su inittab para usar mgetty, que es una versión más inteligente y fácil de controlar de getty.

3

Para deshabilitar la consola Linux, debe cambiar la línea de comandos de Linux creada por el gestor de arranque desde: console =/dev/ttyS? a: console = null

2

Como las otras notas han dado a entender, hay varias cosas que debe comprobar, recogidos aquí:

  1. Asegúrese de que el núcleo de Linux no está utilizando el puerto serie. Asegúrese de que no haya ninguna opción console = en el comando bootload en su archivo grub. Por lo general, no está allí por defecto.
  2. Asegúrese de que no se ejecuta getty en el puerto serie. Busque en/etc/inittab una entrada para/dev/ttyS0 (puerto serie A) y coméntelo si está allí.
  3. Asegúrese de que/dev/ttyS0 sea legible y escribible por su proceso. Puede crear un usuario específico bajo el cual se ejecuta el programa de control, y que posee el/dev/ttyS0, luego chmod 700/dev/ttyS0. Esto ayudará a asegurar que algún otro usuario/programa tampoco intente usar el puerto serie.
  4. Use open() en ttyS0 para obtener un fd, luego use la familia de rutinas tcsetattr para establecer la velocidad y la disciplina de la línea.

Los programas de terminal probablemente no sean útiles para usted a menos que pueda ejecutar el mismo programa en el dispositivo incorporado para administrar el otro extremo de la conexión.