linux - mac - mp3tag ubuntu
¿Cómo establecer una velocidad en baudios personalizada en Linux? (6)
Hay un chip de E / S en serie en la CPU de su placa base ( 16650 UART ). Este chip usa un puerto de 8 bits como control y bus de datos, y por lo tanto puede emitir un comando al escribir a través de este control a través del bus de datos y control.
Por lo general, una aplicación realiza los siguientes pasos en el puerto serie
- Establezca la velocidad en baudios, la paridad, la codificación, el control de flujo y la duración de la secuencia de inicio / finalización durante el inicio del programa. Esta configuración se puede realizar a través de ioctl al dispositivo en serie o al comando ''stty''. De hecho, el comando stty usa ioctl para ese dispositivo serial.
- Escriba caracteres de datos en el dispositivo serie y el controlador escribirá caracteres de datos en el chip UART a través de su bus de datos de 8 bits.
En resumen, puede especificar la velocidad en baudios solo en el comando STTY y, a continuación, todas las demás opciones se mantendrán como predeterminadas, y debería ser suficiente para conectarse a otros dispositivos.
Quiero comunicarme a través de mi puerto serie en Linux a un dispositivo con una velocidad en baudios no estándar que no está definida en termios.h
.
Probé el método de alias de "velocidad de transmisión en baudios" de esta publicación , pero cuando ejecuto mi programa C (lo he llamado "programa de prueba"), Linux dice "testprogram sets custom speed on ttyS0. This is deprecated."
Hice una búsqueda en Google, y parece que hay otro (¿más nuevo?) Método para cambiar la velocidad en baudios a un valor no estándar: en http://sourceware.org/ml/libc-help/2009-06/msg00016.html el autor dice que c_flag
de struct termios
debe BOTHER (=CBAUDEX | B0)
con BOTHER (=CBAUDEX | B0)
. Con este método, las tasas de baudios se establecen directamente en los c_ispeed
y c_ospeed de los struct termios
. Sin embargo, no sé cómo uso este método en mi C-programa. Como dijo el autor, no hay BOTHER
definido / disponible cuando termios.h
, entonces, ¿qué se debe hacer para establecer la velocidad en baudios de esta manera?
¿Cómo puedo establecer la velocidad en baudios en un valor no estándar sin cambiar el kernel?
Noté lo mismo acerca de que BOTHER no está definido. Como dijo Jamey Sharp, puedes encontrarlo en <asm/termios.h>
. Solo una advertencia, creo que me encontré con problemas que incluyen tanto el archivo regular y <termios.h>
al mismo tiempo.
Aparte de eso, me encontré con el glibc que tengo, todavía no funcionaba porque tcsetattr de glibc estaba haciendo el ioctl para la versión antigua de struct termios que no presta atención a la configuración de velocidad. Pude establecer una velocidad personalizada haciendo manualmente un ioctl con el nuevo estilo termios2 struct, que también debería estar disponible al incluir <asm/termios.h>
:
struct termios2 tio;
ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = 12345;
tio.c_ospeed = 12345;
ioctl(fd, TCSETS2, &tio);
Para usuarios de Mac (posiblemente también para algunas distribuciones de Linux )
stty ospeed 999999
stty ispeed 999999
Puede establecer una velocidad en baudios personalizada usando el comando stty
en Linux. Por ejemplo, para establecer una velocidad en baudios personalizada de 567890 en su puerto en serie / dev / ttyX0, use el comando:
stty -F /dev/ttyX0 567890
dougg3 tiene esto más o menos (no puedo comentar allí). La principal cosa adicional que necesita saber son los encabezados que no entran en conflicto entre sí pero proporcionan los prototipos correctos. La respuesta es
#include <stropts.h>
#include <asm/termios.h>
Después de eso, puede usar el código de dougg3, preferiblemente con la comprobación de errores alrededor de las llamadas ioctl (). Probablemente necesite poner esto en un archivo .c separado para el resto de su código de puerto serie que utiliza los términos normales para establecer otros parámetros. Primero hacer manipulaciones POSIX, luego esto para establecer la velocidad personalizada, funciona bien en el UART incorporado de la Raspberry Pi para obtener una velocidad en baudios de 250k.
BOTHER
parece estar disponible desde <asm/termios.h>
en Linux. Sacar la definición de allí va a ser increíblemente no portátil, pero supongo que esta API no es portátil de todos modos, por lo que probablemente no sea una gran pérdida.