Linux_embedded_cz5.pdf
(
777 KB
)
Pobierz
KURS
Wprowadzenie do
Linuksa embedded (5)
Obsługa portów szeregowych
Porty szeregowe RS232, RS485 i inne pokrewne już od wielu
dziesięcioleci są dostępne w systemach mikroprocesorowych.
Pomimo powolnego wypierania przez bardziej zaawansowane
interfejsy, chociażby USB, nie zanosi się na to, aby w najbliższej
przyszłości zostały całkowicie wyeliminowane. W zasadzie
w sprzęcie powszechnego użytku nie spotyka się już urządzeń
wyposażonych w RS232, ale pozostaną one nadal wykorzystywane
do programowania układów, diagnostyki (debugowania) itp. Swoją
bardzo długą żywotność zawdzięczają głównie prostocie, a co za
tym idzie łatwej implementacji i dostępności nawet w najtańszych
mikrokontrolerach. Z prostotą wiąże się również łatwa obsługa
programowa. W Linuksie obsługa portów szeregowych, od strony
aplikacji użytkownika jest łatwa, pomimo dużego skomplikowania
podsystemu TTY.
Dodatkowe materiały na CD/FTP:
ftp://ep.com.pl
, user:
19623
, pass:
6c5r20n3
• wszystkie poprzednie części kursu
Dodatkowe materiały
na CD/FTP
są obsługiwane przez interfejs TTY (
T
ele
TY
pe/
T
ele
TY
pewrite), który pierwotnie był przezna-
czony do obsługi właśnie takich, terminali. Jed-
nak rozbudowana architektura oraz konstrukcja
sprawiają, że doskonale radzi sobie ona również
w dzisiejszych czasach. Na
rysunku
9
przedsta-
wiono architekturę podsystemu TTY.
Architektura składa się z trzech warstw.
Zadaniem sterownika modułu jest izyczna ob-
sługa układu peryferyjnego, oraz udostępnianie
jednolitego interfejsu dla modułu dyscypliny
linii. Moduł dyscypliny linii (
Line Discipline
),
odpowiedzialny jest za określenie sposobu wy-
korzystania izycznego portu. Port może być
wykorzystany na wiele sposobów, na przykład
może być wykorzystany jako klasyczna magistra-
la, do której dołączone są urządzenia np. mysz
szeregowa, a może też pełnić rolę terminala TTY.
W wypadku dołączenia myszy, port szeregowy
wykorzystany jest wewnętrznie przez sterownik
myszy i nie jest udostępniany warstwie TTY.
Moduł dyscypliny linii udostępnia zatem dodat-
kową warstwę abstrakcji, uniezależniającą inne
warstwy od sprzętu. W przypadku domyślnej
dyscypliny N_TTY, port jest udostępniany war-
W większości wypadków wszelkie sterowni-
ki dla portów szeregowych, są dostępne w jądrze
i tylko w przypadku portowania jądra do nowej
architektury, będziemy zmuszeni do napisa-
nia odpowiednich sterowników. Aby zapoznać
czytelników z obsługą portu szeregowego, po-
każemy przykład prostego konwertera RS232<-
>TCPIP, który dzięki zaawansowanemu syste-
mowi będziemy mogli napisać w kilkudziesięciu
liniach kodu.
pomocą linii szeregowych dołączane były termi-
nale znakowe komunikujące się z jednostką cen-
tralną. (Jako ciekawostkę na
fotograii
8
przedsta-
wiono oryginalny terminal VT100)
Terminal szeregowy komunikował się z od-
ległą jednostką centralną za pomocą magistrali
szeregowej, ewentualnie z wykorzystaniem
modemu, umożliwiając pracę wielu użytkow-
nikom równocześnie na jednej maszynie. Takie
terminale do dziś można spotkać w niektórych
kasach biletowych. W Linuksie porty szeregowe
Porty szeregowe w Linuksie
– architektura
Architektura, portów szeregowych w Linuk-
sie wywodzi się z czasów, w których w syste-
mach UNIX’owych, do głównego komputera za
Fotograia 8. Terminal znakowy VT100
(
http://www.catb.org/~esr/writings/taouu/
html/ch02s02.html
)
Rysunek 9. Architektura systemu TTY na podstawie
http://www.linux.it/~rubini/docs/
serial/serial.html
68
ELEKTRONIKA PRAKTYCZNA 9/2011
Wprowadzenie do Linuksa embedded
jak one przychodzą z urządzenia
zewnętrznego.
Ponieważ w naszych elektro-
nicznych praktykach bardziej natu-
ralny jest tryb pracy niekanonicznej,
w dalszych rozważaniach skupimy
się tylko na nim. Użycie portu szere-
gowego w Linuksie jest stosunkowo
łatwe i sprowadza się do:
Otwarcia pliku urządzenia por-
tu szeregowego np.
/dev/ttyS0
, za
pomocą wywołania systemowego
open().
Skonigurowania terminala (portu), za po-
mocą wywołania systemowego tcgetattr()/tcse-
tattr().
Odczytu danych z portu za pomocą wywo-
łań systemowych read()/write(), ewentualnie
w połączeniu z wywołaniem systemowym se-
lect()/poll(), gdy mamy do czynienia z wieloma
deskryptorami, obsługiwanymi w jednym wąt-
ku.
należy je odpowiednio zmodyikować, aby uzy-
skać tryb pracy niekanonicznej, wraz z zada-
nymi parametrami transmisji. Na początku za
pomocą funkcji
setispeed
oraz
setospeed
należy
ustawić prędkość pracy portu szeregowego np.
na 115200bps:
err = cfsetispeed( &options, B115200 );
error(err<0);
err = cfsetospeed( &options, B115200 );
error(err<0);
W pliku nagłówkowym
<termios.h>
jest
zdeiniowanych szereg stałych rozpoczynają-
cych się od dużej litery „B”, określających wie-
le popularnych prędkości transmisji. Kolejną
czynnością jest ustawienie odpowiednich lag,
sterujących, tak aby uzyskać niekanoniczny tryb
pracy, oraz skonigurować pozostałe parametry
portu, czyli ilość bitów danych, kontrolę parzy-
stości, ilość bitów stopu. Na przykład poniższa
koniguracja ustawia terminal w tryb pracy 8
bitów danych, 1 bit stopu, brak kontroli parzy-
stości, oraz brak kontroli przepływu (
listing
18
).
Wyzerowanie lagi
PARENB
skutkuje wyłą-
czeniem generowania i sprawdzania bitu kon-
troli parzystości. Jeżeli ta laga jest ustawiona,
a dodatkowa laga
PAREODD
jest wyzerowana,
wówczas kontrola parzystości jest nieparzysta,
w przeciwnym wypadku parzysta. Pole
CS8
usta-
la liczbę bitów danych na 8. Inne dopuszczalne
ustawienia to
CS5...CS8
. Wyzerowanie lagi
CRTSCTS
oznacza brak sprzętowego sterowania
przepływem. Ustawienie lagi
CREAD
powodu-
je, że port szeregowy będzie przyjmował dane.
Wyzerowanie lag
~(ICANON | ECHO | ECHOE
| ISIG)
, powoduje wyłączenie trybu kanoniczne-
go, a zatem terminal tty nie będzie interpretował
odebranych znaków. Wyzerowanie lag
INPCK
i
ISTRIP
powoduje, że kontrola parzystości ode-
branych znaków nie będzie prowadzona, a dane
będą przekazywane do bufora odbiorczego
niezależnie od rezultatu kontroli parzystości.
Wyzerowanie lag
ICRNL | INLCR
spowoduje
nieprzetwarzanie znaków końca linii, natomiast
wyzerowanie lagi
IUCLC
spowoduje wyłączenia
zamiany małych liter na duże podczas wysyła-
nia. Na zakończenie są zerowane lagi, odpowie-
dzialne za programową kontrolę przepływu oraz
laga
OPOST
zabraniająca przetwarzania znaków
do wysłania. Jak więc widzimy, lagi sterujące
umożliwiają zmianę wielu różnych parametrów,
nie tylko związanych z portem szeregowym, ale
i z samym terminalem. Po ustawieniu trybu nie-
kanonicznego, bez dodatkowego przetwarzania
znaków, na koniec należy ustawić jeszcze pa-
rametry określające minimalną liczbę znaków ,
oraz czas międzyznakowy, który będzie powodo-
wał wyjście z uśpienia blokującej funkcji read()
i zwrócenie przez nią odebranych danych.
//Set char and interchar timeout 0ms 1chars
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
Pole
c_cc[VTIME]
określa czas między zna-
kowy wyrażony jednostkach będących wielo-
krotnością 100 ms, po przekroczeniu którego
funkcja
read()
zwróci odczytane dane (
interchar-
Listing 17. Deinicja struktury
termios
struct termios
{
tclag_t c_ilag;
/* input mode lags */
tclag_t c_olag;
/* output mode lags */
tclag_t c_clag;
/* control mode lags */
tclag_t c_llag;
/* local mode lags */
cc_t c_line;
/* line discipline */
cc_t c_cc[NCCS];
/* control characters */
speed_t c_ispeed;
/* input speed */
speed_t c_ospeed;
/* output speed */
#deine _HAVE_STRUCT_TERMIOS_C_ISPEED 1
#deine _HAVE_STRUCT_TERMIOS_C_OSPEED 1
};
stwie TTY, która z kolei udostępnia go aplika-
cjom przestrzeni użytkownika w postaci plików
urządzeń. W przypadku portów szeregowych
RS232 są to odpowiednio pliki /dev/ttyS
x
, gdzie
x
określa numer porządkowy portu. W wypadku
portów szeregowych dołączanych za pomocą
USB, wykorzystujące własne klasy USB będą
to pliki /dev/ttyUSB
x
(x=0-n), a w przypadku
klasy CDC-ACM będą to pliki /dev/ttyACM
x
(x=0-n).Dzięki dodatkowej pośredniej warstwie
abstrakcji , podsystem jest bardzo elastyczny,
a jego użycie w aplikacji użytkownika pomimo
skomplikowania jest stosunkowo proste. Warto
w tym miejscu wspomnieć, że podsystem
TTY
obsługuje także klasyczną konsolę, którą stanowi
klawiatura-ekran, a zatem służy on nie tylko do
obsługi portów szeregowych.
Najbardziej skomplikowaną częścią z wy-
żej wymienionych jest koniguracja terminala
tty
(portu), która wymaga zmiany kilkunastu
ustawień w strukturze
termios
, reprezentującej
aktualny stan terminala. Prześledzimy teraz krok
po kroku jak przebiega otwarcie oraz konigura-
cja portu na przykładzie hipotetycznego portu
szeregowego reprezentowanego przez plik
/dev/
ttyS1
. Pierwszą czynnością będzie otwarcie por-
tu za pomocą wywołania
int serfd = open( port
,O_RDWR | O_NOCTTY );
Ustawienie lagi
O_NOCTTY
jest konieczne
i informuje o tym, aby w wypadku braku przy-
pisanego domyślnego terminala do procesu, port
nie został wykorzystany jako terminal domyślny.
Po otwarciu portu szeregowego, należy pobrać
aktualną konigurację terminala tty do struktury
termios
, za pomocą wywołania :
struct
termios options;
int err = tcgetattr( serfd, &options );
error(err<0);
Deinicję struktury
termios
umieszczono na
listingu
17
. Pole
c_ilag
, określa sposób przetwa-
rzania znaków otrzymanych przez urządzenie,
pole
c_olag
określa sposób traktowania znaków
wysłanych do urządzenia. Pole
c_clags
zawiera
lagi sterujące, które deiniu-
ją techniczne parametry pra-
cy urządzenia terminalowe-
go. Pole
c_llag
określa tryb
pracy działania dyscypliny
linii związanej z urządze-
niem terminalowym. Tablica
c_cc
zawiera znaki specjalne
określające zachowanie ter-
minala w trybie kanonicz-
nym oraz ustawienia trybu
niekanonicznego, o czym
dalej. Pola
c_ispeed
oraz
c_ospeed
zawierają prędkość
wejściową i wyjściową urzą-
dzenia terminalowego.
Po odczytaniu aktual-
nych ustawień terminala
Użycie portów szeregowych
w aplikacjach użytkownika
Jak wspomniano, port szeregowy w Linuk-
sie traktowany jest jako terminal i obsługiwany
przez podsystem
tty
, przez co ilozoia obsługi
jest nieco odmienna od obsługi portów w syste-
mach Windows, które mają dedykowane funkcję
API służące do obsługi tylko i wyłącznie portów
szeregowych. Jedną z takich odmiennych rzeczy
są różne tryby pracy terminala (portu szeregowe-
go), do których należą:
Tryb pracy kanonicznej
, gdzie linia
tty
pra-
cuje jak klasyczny terminal, w trybie liniowym,
co oznacza że funkcja odczytująca zwróci je,
jedynie po odebraniu znaku zakończenia linii.
(Znak CR)
Tryb pracy
nie-kanonicznej
, w którym linia
tty
przekazuje pojedyncze odebrane dane, tak
Listing 18. Ustalenie ramki transmisji RS232
//8N1 frame
options.c_clag &= ~PARENB;
options.c_clag &= ~CSTOPB;n
options.c_clag &= ~CSIZE;
options.c_clag |= CS8;
//disable hardware low control
options.c_clag &= ~CRTSCTS;
//Enable receiver and local mode
options.c_clag |= (CLOCAL | CREAD);
//Raw input
options.c_llag &= ~(ICANON | ECHO | ECHOE | ISIG);
//Disable parity checking
options.c_ilag &= ~(INPCK | ISTRIP);
//Don’t map CR to NL or NL to CR
options.c_ilag &= ~(ICRNL | INLCR);
//Don’t map uppercase to lowercase
options.c_ilag &= ~IUCLC;
//Don’t ignore CR
options.c_ilag &= ~IGNCR;
//Ignore BREAK condition
options.c_ilag |= IGNBRK;
//Disable software low control
options.c_ilag &= ~(IXON | IXOFF | IXANY);
//Raw output - other c_olag bits ignored
options.c_olag &= ~OPOST;
69
ELEKTRONIKA PRAKTYCZNA 9/2011
KURS
timeout
), natomiast pole
c_cc[VMIN]
zawiera mi-
nimalną liczbę znaków, po przekroczeniu której
funkcja
read()
wyjdzie z uśpienia i zwróci dane.
Sterując tymi polami, mamy możliwość wpływu
na sposób zachowania się procedury odbiera-
nia danych. Wpisanie w pola
VMIN
, oraz
VIME
wartości 0 spowoduje, że wywołania
read()
, oraz
write()
będą nieblokujące.
Jednak metoda cyklicznego sprawdzania
stanu nie jest najlepszym rozwiązaniem w przy-
padku środowiska wieloprogramowego, dlatego
w wypadkach, gdy istnieje konieczność obsługi
wielu deskryptorów należy posłużyć się wywo-
łaniem
poll()
lub
select()
. Po ustawieniu para-
metrów, należy wywołać funkcję
tcsetattr
, która
spowoduje ustawienie zadanych parametrów
w urządzeniu tty:
err = tcsetattr( serfd, TCSANOW, &options );
error(err<0);
Jest to ostatnia czynność, po której urządze-
nie tty będzie zachowywało się jak klasyczny
port szeregowy, do którego jesteśmy przyzwycza-
jeni z innych systemów operacyjnych.
Listing 19. Przykładowy program obsługi UART
int main(void)
{
int lsock = create_listening_socket( LISTEN_PORT );
int serial = open_serial_port( SERIAL_DEVICE, SERIAL_SPEED );
printf(“Waiting for device connection on port %d .\n”,LISTEN_PORT);
for(;;)
{
//Accept the connection from incomming socket
int conn_sock = accept(lsock,NULL,NULL);
printf(“Connected from remote...\n”);
struct pollfd fds[] =
{
{ serial, POLLIN|POLLERR, 0 },
{ conn_sock, POLLIN|POLLERR, 0 }
};
//Internal process loop
for(bool no_disc=true;no_disc;)
{
//Poll syscall sleep for data arriving
int res = poll( fds, sizeof(fds)/sizeof(fds[0]), -1 );
//Check error
error(res<0);
//Scan active fds
for( unsigned p=0; p<sizeof(fds)/sizeof(fds[0]); p++)
{
//If no revents continue
if(fds[p].revents==0) continue;
//If error (exit )
error( fds[p].revents & POLLERR );
//If input data
if(fds[p].revents & POLLIN )
{
//Got data from serial write to network
if(fds[p].fd == serial)
{
//Got data from serial port write it to remote host
fds_copy( conn_sock, serial );
}
//Got data from network write to serial
if(fds[p].fd == conn_sock)
{
//Got data from network write it to serial port
if( fds_copy( serial, conn_sock ) == 0 )
{
//If socket closed connection disconnect
no_disc = false;
close( conn_sock );
printf(“Host disconnected ...\n”);
break;
}
}
}
}
}
}
//Close open sockets
close( lsock );
close( serial );
return 0;
}
Przykład praktyczny
Płytka prototypowa
BF210
posiada wypro-
wadzone 3 porty szeregowe, 2 szt. RS232 oraz
1 szt. RS485. Jeden z portów
RS232
pełni rolę
konsoli szeregowej aplikacji, dlatego do dyspozy-
cji mamy jeden port
RS232
mapowany jako
/dev/
ttyS1
, oraz port szeregowy
RS485
, z automatycz-
ną zmiana kierunku mapowany jako
/dev/ttyS2
.
Demonstrując użycie praktyczne portu pokażemy
przykład prostego konwertera RS232,–>TCPIP,
który będzie udostępniał port szeregowy
/dev/
ttyS1
(złącze J6) pracujący w koniguracji 115200,
n, 8, 1 oczekując na nadchodzące połączenia na
porcie TCP 7900. Napisanie podobnej aplikacji
na mikrokontroler jednoukładowy wymagało
by dużego nakładu pracy, a tutaj taka aplikacja
składa się dosłownie z kilkudziesięciu linii kodu.
Przykład ten może mieć praktyczne zastosowanie
po rozbudowaniu o autentykację użytkownika,
szyfrowanie danych SSL, czy możliwość zdal-
nej koniguracji parametrów portu szeregowego.
Działanie aplikacji może być sprzetestowane
z wykorzystaniem komputera PC, gdzie do portu
RS232 podłączymy się programem terminalo-
wym, natomiast na port TCP 7900 podłączymy
się za pomocą programu telnet.
Listing 20. Struktura
pollfd
struct pollfd
{
int fd;
/* File descriptor to poll. */
short int events;
/* Types of events poller cares about. */
short int revents;
/* Types of events that actually occurred. */
};
Listing 21. Funkcja fds_copy
//Copy data from one ile descriptor to another
static int fds_copy(int to_fds, int from_fds)
{
char trx_buf[4096];
//Read data from irst fds
int rd = read( from_fds, trx_buf, sizeof(trx_buf) );
error(rd < 0);
//Write data to second fds
int wr = 0;
while( rd > 0)
{
int wres = write( to_fds, &trx_buf[wr], rd );
error(wres<0);
wr += wres;
rd -= wr;
}
return wr;
}
Opis aplikacji
Kod źródłowy aplikacji konwertera RS232<–
>TCPIP znajduje się w pliku źródłowym
rsto-
eth.c
, który następnie jest kompilowany do pliku
wykonywalnego
rstoeth
. Koniguracja aplikacji
zawarta jest na początku pliku za pomocą dyrek-
tyw #deine, gdzie mamy możliwość zmiany ak-
tualnego portu szeregowego, prędkości transmi-
sji, czy portu TCP. W praktycznym przykładzie
należy uzupełnić aplikacje o odczyt parametrów
z pliku koniguracyjnego, czy protokół zdalnej
zmiany ustawień portu szeregowego. Program
rozpoczyna działanie od wykonania pętli main()
(listing n)
Na początku wywoływana jest funkcja
cre-
ate_listening_socket(),
która jest odpowiedzialna
za utworzenie słuchającego gniazda na porcie
przekazanym jako argument. Kolejną czynnością
jest otwarcie portu szeregowego co jest realizo-
wane za pomocą funkcji
open_serial_port()
, po
czym, program wchodzi do pętli głównej, gdzie
wywoływana jest funkcja systemowa
accept()
.
Funkcja ta blokuje się w oczekiwaniu na nad-
chodzące połączenia, i w przypadku nawiązania
70
ELEKTRONIKA PRAKTYCZNA 9/2011
Wprowadzenie do Linuksa embedded
połączenia zwraca deskryptor gniazda nowego
połączenia. Po wywołanie funkcji
accept()
, na-
stępuje utworzenie tablicy struktur
pollfd
dla
wywołania systemowego
poll().
Strukturę
pollfd
pokazano na
listingu
20
.
Pole
fd
zawiera deskryptor pliku, pole
events
zawiera lagi wejściowe np.
POLLIN, POLLOUT,
POLLER
określające zdarzenia, na które ocze-
kujemy na danym deskryptorze. Pole
revent
jest
zwracane przez funkcję systemową
poll()
i infor-
muje, jakie zdarzenie miało miejsce na danym
deskryptorze. W naszym przypadku tworzymy
tablicę dwuelementową do której wpisano de-
skryptory od gniazda połączenia i portu sze-
regowego, a w polach
events
ustawiono lagi
POLLIN|POLLER
, co będzie owocowało wybu-
dzeniem funkcji systemowej
poll()
w momencie
odebrania danych lub błędu na którymkolwiek
z deskryptorów. Następnie program wchodzi do
pętli wewnętrznej, której głównym elementem
jest wywołanie systemowe
poll(),
które blokuje
się w oczekiwaniu na nadejście danej z deskryp-
tora portu szeregowego lub deskryptora gniazda
połączenia. Jeżeli wystąpią dane odebrane na
którym z deskryptorów,
pool()
wyjdzie z uśpie-
nia i ustawi odpowiednie pola
revents
w tablicy
struktur
fds
. Program sprawdza zawartość pół
revents
w tablicy
fds
i w wypadku wykrycia zda-
rzenia
POLLERR
kończy działanie wychodząc
z błędem. Natomiast w przypadku wystąpienia
zdarzenia
POLLIN
, na danym deskryptorze wy-
woływana jest funkcja
fds_copy
(
listing
21
)
,
która
kopiuje dane z jednego deskryptora do drugiego.
Funkcja ta jako pierwszy argument przyjmu-
je deskryptor , gdzie będą skopiowane odebrane
dane, natomiast jako drugi argument przyjmuje de-
skryptor skąd będą skopiowane dane. Działanie tej
funkcji sprowadza się do wywołania funkcji sys-
temowej
read()
,
która odczyta zgromadzone dane,
ale nie zablokuje się, ponieważ jest wiadome dzięki
wywołaniu
poll()
, że deskryptor zawiera dane do
odczytania. Następnie tak odebrane dane są kopio-
wane za pomocą wywołania
write()
do deskrypto-
ra docelowego. Funkcja
write()
jest wywoływana
w pętli, tak aby zapisać wszystkie oczekujące dane,
ponieważ zgodnie ze specyikacją może ona zapi-
sać mniej danych niż żądano. Rezultatem działania
funkcji jest zwrócenie liczby zapisanych bajtów.
W wypadku, gdy zdalny host zakończy połączenie,
wywołanie
poll()
zwróci w polu
revents
deskryp-
tora gniazda lagę
POLLIN
, natomiast wywołanie
read()
zwróci wartość 0, co pozwoli na wykrycie
momentu zakończenie połączenia. W momencie
wykrycia rozłączenia pętla wewnętrzna jest opusz-
czana w wyniku czego zostanie ponownie wywo-
łana funkcja systemowa
accept()
oczekująca na
ponowne nawiązanie połączenia.
opisano w pierwszym odcinku. Po wgraniu przy-
kładu na kartę należy BF210 dołączyć do sieci,
uruchomić i zalogować się na konsoli szerego-
wej. Po zalogowaniu się należy wydać polece-
nie
ifconig eth0
, w wyniku czego powinniśmy
otrzymać informację o aktualnie przydzielonym
adresie z serwera DHCP adresie IP.
Adres ten na-
leży zapamiętać celem późniejszego wykorzysta-
nia do połączenia z BF210 za pomocą programu
telnet
. Gdy już odczytaliśmy aktualny adres IP,
należy uruchomić program wydając polecenie
rstoserial
.
Program powinien uruchomić się i po-
informować o oczekiwaniu na połączenie:
root@bf210-at91:~# rstoeth
Waiting for device connection on port 7900
...
Gdy program jest uruchomiony należy
przełączyć gniazdo portu szeregowego na J6,
(lub użyć drugiego portu szeregowego w kom-
puterze), tak abyśmy mogli wysyłać i odbie-
rać dane z tego portu. Następie na komputerze
należy wydać polecenie
telnet [zapamietany
adres ip] 7900
. Program powinien dołączyć się
do płytki BF210 przez port 7900. Po połączeniu
możemy wpisywać znaki w oknie programu
tel-
net
i obserwować odebrane znaki w programie
terminalowym portu szeregowego, i odwrotnie
– wpisywać znaki w programie terminalowym,
do którego jest dołączony port szeregowy BF210
i obserwować odebrane dane w programie
telnet
.
Lucjan Bryndza, EP
Uruchomienie przykładu
Skompilowany przykład wraz systemem do-
starczany jest w postaci pliku obrazu
example5.
img
. Przykład należy nagrać na kartę SD tak jak
REKLAMA
„Przetestowaliśmy narzędzia wszystkich wiodących
dostawców oprogramowania EDA, w poszukiwaniu
idealnego rozwiązania, które pozwoli dostarczać projekty
naszym klientom tak szybko, jak to tylko możliwe.
Dzięki uniwersalności, elastyczności i łatwości użycia,
system Altium był bezkonkurencyjny.”
Phil Gibson
Wiceprezes National Semiconductor
ul. Przybyły 2, 43-300 Bielsko-Biała, tel. 33 499 59 00, 499 59 12
eda@evatronix.com.pl, www.evatronix.com.pl/eda
71
ELEKTRONIKA PRAKTYCZNA 9/2011
Plik z chomika:
bulwion
Inne pliki z tego folderu:
Wentylatory.pdf
(1666 KB)
Star Wars. Katalizator. Wprowad - James Luceno.pdf
(1665 KB)
Gordon R. Dickson - Smoczy rycerz T2.pdf
(1663 KB)
LOKOMOTYWA TOWAROWA EMD JT42CWRM(Class66).pdf
(1662 KB)
Greer Luanshya - Kto sieje wiatr 02 - Po burzy spokój.pdf
(1660 KB)
Inne foldery tego chomika:
- - 1024--Fillm
- - 2024--FULL---
- - 2K wallpapers
- - ART PICS
- - FILMY 2023-2025 WSZYSTKIE NOWOŚCI
Zgłoś jeśli
naruszono regulamin