CourseWare Wiki
Switch Term
Summer 2023 / 2024
Summer 2022 / 2023
Summer 2021 / 2022
Summer 2020 / 2021
Summer 2019 / 2020
Summer 2018 / 2019
Summer 2017 / 2018
Older
Search
Log In
b172
courses
b3b36prg
tutorials
serial
Warning
This page is located in archive. Go to the latest version of this
course pages
.
Differences
This shows you the differences between two versions of the page.
View differences:
Side by Side
Inline
Go
Link to this comparison view
Go
Go
courses:b3b36prg:tutorials:serial [2018/02/06 17:18]
courses:b3b36prg:tutorials:serial [2018/02/06 17:18]
(current)
Line 1:
Line 1:
+
{{indexmenu_n>4100}}
+
===== Nastavení sériového portu ======
+
Přestože je sériový port blokové zařízení, které je v OS reprezentované souborem v adresáři ''/dev/'' a lze s ním tak pracovat jako s běžným souborem funkcemi ze standardní knihovny např. ''fopen()'' nebo ''fwrite()'', je z důvodu přímého přístup výhodnější využít funkce systémové knihovny jako jsou ''open()'', ''close()'', ''read()'' a ''write()''. Tyto funkce nepracují s ukazatelem na strukturu ''FILE*'', ale přímo s tzv. //file deskriptorem//, který je reprezentovaný celým číslem typu ''int''.
+
+
Nastavení parametrů komunikace je možné prostřednictvím funkce knihovny ''<termios.h>'', například nastavení rychlosti 115200 bps spolu s VMIN a VTIME (viz např. [[http://unixwiz.net/techtips/termios-vmin-vtime.html|Understanding UNIX termios VMIN and VTIM]]) lze ralizovat
+
+
<code c>
+
int fd = open(fname, O_RDWR | O_NOCTTY | O_SYNC);
+
struct termios term;prg_serial.h a
+
tcgetattr(fd, &term);
+
cfmakeraw(&term);
+
term.c_cc[VTIME] = 2; //set vtime
+
term.c_cc[VMIN] = 1;
+
cfsetispeed(&term, BAUD_RATE);
+
cfsetospeed(&term, BAUD_RATE);
+
tcsetattr(fd, TCSADRAIN, &term) >= 0);
+
fcntl(fd, F_GETFL) >= 0);
+
tcsetattr(fd, TCSADRAIN, &term);
+
fcntl(fd, F_GETFL);
+
tcflush(fd, TCIFLUSH);
+
tcsetattr(fd, TCSANOW, &term);
+
</code>
+
+
kde pro jednoduchost netestujeme hodnoty návratových hodnot volání jednotlivých funkcí.
+
+
Pro znakově orientovaný vstup/výstup pak můžeme zapouzdřit volání read/write do samostatných funkcí např.
+
<code c>
+
+
int serial_close(int fd)
+
{
+
return close(fd);
+
}
+
+
int serial_putc(int fd, char c)
+
{
+
return write(fd, &c, 1);
+
}
+
</code>
+
+
Příslušné funkce pro otevření, zavření a čtení/zápis znaku jsou implementované v modulu {{:courses:b3b36prg:tutorials:prg_serial.zip|prg_serial}}.
+
/*
+
===== Neblokovaný režim a "polling" =====
+
*/
courses/b3b36prg/tutorials/serial.txt
· Last modified: 2018/02/06 17:18 (external edit)