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
883836458.085.png 883836458.096.png 883836458.107.png 883836458.118.png 883836458.001.png 883836458.012.png 883836458.022.png 883836458.033.png 883836458.039.png 883836458.040.png 883836458.041.png 883836458.042.png 883836458.043.png 883836458.044.png 883836458.045.png 883836458.046.png 883836458.047.png 883836458.048.png 883836458.049.png 883836458.050.png 883836458.051.png 883836458.052.png 883836458.053.png 883836458.054.png 883836458.055.png 883836458.056.png 883836458.057.png 883836458.058.png 883836458.059.png 883836458.060.png 883836458.061.png 883836458.062.png 883836458.063.png 883836458.064.png 883836458.065.png 883836458.066.png 883836458.067.png 883836458.068.png 883836458.069.png 883836458.070.png 883836458.071.png 883836458.072.png 883836458.073.png 883836458.074.png 883836458.075.png 883836458.076.png 883836458.077.png 883836458.078.png 883836458.079.png 883836458.080.png 883836458.081.png 883836458.082.png 883836458.083.png 883836458.084.png 883836458.086.png 883836458.087.png 883836458.088.png 883836458.089.png 883836458.090.png 883836458.091.png 883836458.092.png 883836458.093.png 883836458.094.png 883836458.095.png 883836458.097.png 883836458.098.png 883836458.099.png 883836458.100.png 883836458.101.png 883836458.102.png 883836458.103.png 883836458.104.png 883836458.105.png 883836458.106.png 883836458.108.png 883836458.109.png 883836458.110.png 883836458.111.png 883836458.112.png 883836458.113.png 883836458.114.png 883836458.115.png 883836458.116.png 883836458.117.png 883836458.119.png 883836458.120.png 883836458.121.png 883836458.122.png 883836458.123.png 883836458.124.png 883836458.125.png 883836458.126.png 883836458.127.png 883836458.128.png 883836458.002.png 883836458.003.png 883836458.004.png 883836458.005.png 883836458.006.png 883836458.007.png 883836458.008.png 883836458.009.png 883836458.010.png 883836458.011.png 883836458.013.png 883836458.014.png 883836458.015.png 883836458.016.png 883836458.017.png
 
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
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
883836458.018.png
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
883836458.019.png
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
883836458.020.png 883836458.021.png 883836458.023.png 883836458.024.png 883836458.025.png 883836458.026.png 883836458.027.png 883836458.028.png 883836458.029.png 883836458.030.png 883836458.031.png 883836458.032.png 883836458.034.png 883836458.035.png 883836458.036.png 883836458.037.png 883836458.038.png
 
Zgłoś jeśli naruszono regulamin