Pregunta ¿Cómo establecer una velocidad en baudios personalizada en Linux?


Quiero comunicarme a través de mi puerto serie en Linux a un dispositivo con una velocidad de baudios no estándar que no está definida en termios.h.

Probé el "aliasing de la tasa de baudio": método de esta publicación, pero cuando ejecuto mi C-program (lo he llamado "testprogram"), 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 el c_flag de struct termios debe ser OR con BOTHER (=CBAUDEX | B0). Con este método, las tasas de baudios se establecen directamente en c_ispeed y c_ospeed-Los miembros de la 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 incluyo 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?


32
2017-09-28 19:39


origen


Respuestas:


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 encontré problemas que incluyen tanto el <termios.h> archivo 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);

19
2017-11-15 02:32



Puede establecer una velocidad en baudios personalizada usando el stty comando 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

13
2017-12-11 11:33



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.


3
2018-02-22 20:49



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.


0
2017-11-05 06:39



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

  1. 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.
  2. 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.


0
2017-12-14 06:56



Para usuarios de Mac (posiblemente también para algunos Distribuciones de Linux)

stty ospeed 999999

stty ispeed 999999

0
2017-11-19 21:58