Как cat узнает скорость передачи последовательного порта?

24

Я регулярно использую catдля просмотра отладочную информацию в консоли с моей платы разработки FPGA через последовательное соединение, но мне никогда не приходилось сообщать linux, какова скорость передачи данных. Как cat узнает, какова скорость передачи последовательного соединения?

stanri
источник
Вы не настроили порт например с помощью minicomранее? Это не работает здесь. Только после настройки параметров последовательного порта я могу использовать cat.
Марко
Он не устанавливает или не знает скорость передачи, он просто читает с устройства.
Ульрих Дангел
@ Марко, я не знаю, есть ли в Debian какая-то настройка скорости передачи по умолчанию, но я нигде не устанавливал ее.
Станри

Ответы:

34

В sttyнаборы коммунальные или отчеты о характеристиках терминала ввода / вывода для устройства , которое является его стандартный ввод. Эти характеристики используются при установлении соединения по этой конкретной среде. catне знает скорость передачи как таковую, скорее печатает на экране информацию, полученную от конкретного соединения.

В качестве примера stty -F /dev/ttyACM0приведена текущая скорость передачи данных для устройства ttyACM0.

stanri
источник
1
но как тогда stty узнал о скорости передачи? Этот ответ лишь каким-то образом откладывает вопрос: можно ли автоматически определять скорость передачи данных или установить ее в какой-то момент (т. Е. Через stty)
humanityANDpeace
@humanityANDpeace Я предполагаю, что скорость передачи по умолчанию была той, которую я использовал. Позже мне нужно было изменить его через STTY, когда я изменил скорость передачи данных на устройстве.
Станри
9

catпросто использует те параметры, для которых порт уже настроен. С помощью этого небольшого фрагмента C вы можете увидеть скорость передачи, установленную в данный момент для определенного последовательного порта:

получить бод-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;
}

Запустить его:

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

Полученные числа можно посмотреть /usr/include/asm-generic/termios.h, где есть #defineтакие, как, например, и B9600т. Д. Обратите внимание, что числа в заголовочном файле и в get-baud-rateвыходных данных приведены в восьмеричном виде.

Может быть, вы можете поэкспериментировать и посмотреть, на что похожи эти цифры при новой загрузке и изменятся ли они позже.

clacke
источник
2
Я только что нашел sttyкоманду, которая делает именно это. Например, stty -F /dev/ttyACM0дает мне текущую скорость передачи данных, которая подходит для моего устройства.
Станри
Конечно, это гораздо лучшая идея.
Clacke