¿Cómo sabe Cat la velocidad en baudios del puerto serie?

24

Regularmente uso catpara ver información de depuración en la consola desde mi placa de desarrollo FPGA a través de la conexión en serie, pero nunca tuve que decirle a Linux cuál es la velocidad en baudios. ¿Cómo sabe cat cuál es la velocidad en baudios de la conexión en serie?

Stanri
fuente
¿No configuró el puerto, por ejemplo, con minicomantes? No funciona aqui. Solo después de configurar los parámetros del puerto serie que puedo usar cat.
Marco
No establece o conoce la velocidad en baudios, solo lee desde el dispositivo.
Ulrich Dangel
@Marco, no sé si Debian tiene alguna configuración predeterminada de velocidad de transmisión, pero no la he configurado en ningún lado.
stanri

Respuestas:

34

La sttyutilidad establece o informa sobre las características de E / S del terminal para el dispositivo que es su entrada estándar. Estas características se utilizan al establecer una conexión a través de ese medio en particular. catno conoce la velocidad en baudios como tal, sino que imprime en la pantalla la información recibida de la conexión particular.

Como ejemplo, se stty -F /dev/ttyACM0proporciona la velocidad de transmisión actual para el dispositivo ttyACM0.

Stanri
fuente
1
pero, ¿cómo sabía stty sobre la velocidad en baudios entonces? Esta respuesta solo difiere de alguna manera la pregunta, si la velocidad en baudios se puede detectar automáticamente o si se estableció en algún momento (es decir, a través de stty)
humanityANDpeace
@humanityANDpeace Supongo que la velocidad de transmisión predeterminada era la que estaba usando. Más tarde tuve que cambiarlo a través de stty cuando cambié la velocidad en baudios del dispositivo.
stanri
9

catsolo usa cualquier configuración para la que el puerto ya esté configurado. Con este pequeño fragmento de C puede ver la velocidad en baudios actualmente configurada para un puerto serie en particular:

get-baud-rate.c

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

int main() {
  struct termios tios;
  tcgetattr(0, &tios);
  speed_t ispeed = cfgetispeed(&tios);
  speed_t ospeed = cfgetospeed(&tios);
  printf("baud rate in: 0%o\n", ispeed);
  printf("baud rate out: 0%o\n", ospeed);
  return 0;
}

Ejecutarlo:

./get-baud-rate < /dev/ttyS0 # or whatever your serial port is

Los números que obtiene se pueden buscar /usr/include/asm-generic/termios.h, donde hay #defines tales como B9600etc. Tenga en cuenta que los números en el archivo de encabezado y en la get-baud-ratesalida están en octal.

Tal vez pueda experimentar y ver cómo son estos números en un arranque nuevo y si cambian más tarde.

clacke
fuente
2
Acabo de encontrar el sttycomando que hace exactamente esto. Por ejemplo, stty -F /dev/ttyACM0me da la velocidad de transmisión actual, que es correcta para mi dispositivo.
stanri
Por supuesto que es una idea mucho mejor.
clacke