Як кішка знає швидкість передачі даних в серійному порту?


24

Я регулярно використовую catдля перегляду інформації про налагодження в консолі з моєї плати розвитку FPGA через послідовне з'єднання, але мені ніколи не доводилося розповідати Linux, що таке швидкість передачі даних. Звідки кішка знає, яка швидкість передачі даних у послідовному з'єднанні?


Ви не встановили порт, наприклад, minicomраніше? Тут не працює. Лише після встановлення параметрів послідовного порту я можу використовувати cat.
Марко

Він не встановлює і не знає бодрат, він просто читає з пристрою.
Ульріх Дангел

@Marco, я не знаю, чи є Debian встановлений швидкість передачі даних за замовчуванням, але я його ніде не встановлював.
stanri

Відповіді:


34

В sttyнабори комунальні або звіти про характеристики терміналу введення / виведення для пристрою , яке є його стандартне введення. Ці характеристики використовуються при встановленні зв'язку через конкретний носій. catне знає швидкості передачі даних як такої, вона швидше друкує на екрані інформацію, отриману від конкретного з'єднання.

Як приклад stty -F /dev/ttyACM0наводить поточну швидкість передачі даних для пристрою ttyACM0.


1
але як Stty тоді знав про швидкість передачі? Відповідь на це питання тільки відстрочує як - то питання, якщо швидкість передачі даних може бути автоматично або була встановлена в якому - то момент (тобто через stty)
humanityANDpeace

@humanityANDpeace Я припускаю, що швидкість передачі даних за замовчуванням була тією, яку я випадково використовував. Пізніше мені потрібно було змінити його через stty, коли я змінив швидкість передачі даних на пристрої.
stanri

9

catпросто використовує всі налаштування, для яких порт уже налаштований. За допомогою цього маленького фрагмента C ви можете бачити швидкість передачі даних, яка наразі встановлена ​​для певного послідовного порту:

get-boud-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вихідному значенні є у вісімці.

Можливо, ви зможете поекспериментувати та побачити, як виглядають ці номери у свіжому завантаженні та чи змінюються вони згодом.


2
Я щойно знайшов sttyкоманду, яка робить саме це. Наприклад, stty -F /dev/ttyACM0дає мені поточну швидкість передачі даних, яка є правильною для мого пристрою.
stanri

Звичайно, це набагато краща ідея.
клак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.