Skąd kot zna szybkość transmisji portu szeregowego?


24

Regularnie używam catdo przeglądania informacji o debugowaniu w konsoli z mojej płyty rozwojowej FPGA przez połączenie szeregowe, ale nigdy nie musiałem mówić linuxowi, jaka jest prędkość transmisji. Skąd kot wie, jaka jest szybkość transmisji połączenia szeregowego?


Nie skonfigurowałeś portu np. minicomWcześniej? Tu nie działa. Dopiero po skonfigurowaniu parametrów portu szeregowego mogę użyć cat.
Marco

Nie ustawia lub nie zna prędkości transmisji, po prostu czyta z urządzenia.
Ulrich Dangel

@Marco, nie wiem, czy Debian ma jakieś domyślne ustawienie szybkości transmisji, ale nigdzie go nie ustawiłem.
stanri

Odpowiedzi:


34

Program sttynarzędziowy ustawia lub raportuje charakterystykę I / O terminala dla urządzenia, które jest jego standardowym wejściem. Te cechy są wykorzystywane przy ustanawianiu połączenia za pośrednictwem tego konkretnego medium. catnie zna szybkości transmisji jako takiej, raczej drukuje na ekranie informacje otrzymane z danego połączenia.

Jako przykład stty -F /dev/ttyACM0podaje bieżącą prędkość transmisji dla urządzenia ttyACM0.


1
ale skąd więc Stty wiedział o szybkości transmisji? Ta odpowiedź odracza tylko jakoś się pytanie, czy szybkość transmisji może być wykrywane lub został ustawiony w pewnym momencie (czyli za pośrednictwem stty)
humanityANDpeace

@humanityANDpeace Zakładam, że domyślną szybkością transmisji była ta, której używałem. Później musiałem to zmienić za pomocą stty, kiedy zmieniłem prędkość transmisji w urządzeniu.
stanri

9

catpo prostu używa ustawień, dla których port jest już skonfigurowany. Za pomocą tego małego fragmentu C możesz zobaczyć szybkość transmisji ustawioną aktualnie dla określonego portu szeregowego:

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;
}

Uruchom:

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

Liczby, które otrzymujesz, można sprawdzić /usr/include/asm-generic/termios.h, gdzie są #definetakie jak B9600itp. Zauważ, że liczby w pliku nagłówkowym i na get-baud-ratewyjściu są ósemkowe.

Może poeksperymentujesz i zobaczysz, jak wyglądają te liczby przy nowym rozruchu i czy później się zmienią.


2
Właśnie znalazłem sttypolecenie, które właśnie to robi. Na przykład stty -F /dev/ttyACM0daje mi bieżącą szybkość transmisji, która jest poprawna dla mojego urządzenia.
stanri

Oczywiście to o wiele lepszy pomysł.
clacke,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.