From: Kenan Dogan (kndogan@yahoo.com)
Date: Fri 09 Jan 2004 - 08:08:47 EST
From: "Bora Tuncer"
Subject: [linux-programlama] Re: Portlara erisim
Cevabim geciktigi icin kusura bakmayin. Umarim bu
arada (eger daha once okumamissaniz) siz de belki
"Serial-Programming-HOWTO" belgesine goz atma sansi
bulabilmissinizdir. Ya da "belgeler.org" da varsa,
belki turkcesini de okuma sansiniz olmustur.
> Yazdigim program bir while dongusu icinde portu okuyor
> ve gelen verileri baska bir programa aktariyor
>
> eger bunun icin daha iyi bir yontem biliyorsaniz ,
> mesela portlara veri geldiginde bir interrupt filan
> olusuyorsa biz de bunu handle edecek bir kod yazsak
> daha iyi olur
Bildigim kadari ile Linux'ta DOS'takinin benzeri bir
kesme(=interrupt) kullanimi yok. "Signal processing"
kavrami biraz onu andirsa da, saniyorum sizin yapmak
istediginiz ise bir katkisi olmaz. Ama surekli portu
dinleyen bir "geri plan process" zaten bu is icin
uygun bir yontemdir. Ornegin asagidaki gibi bir komut
satiri ile baslatilabilir :
# ./port-oku /dev/ttyS0 &
* port-oku : bulundugunuz dizindeki, calisma yetkisi
verilmis (orn: 755) C programinin
binary dosyasi
* /dev/ttyS0 : C programina parametre olarak gecirilen
COM portu Linux aygit(=device) ismi
(Ornekte, COM1)
(Siz bunu programin icine sabit olarak
da yerlestirebilirsiniz.)
* & simgesi : Programin "geri planda" (terminali diger
isler icin serbest birakarak) calismasi
icin gerekli
(logout yaptiginizda da calismaya devam
etmesini isterseniz :
# nohup ./port-oku /dev/ttyS0 &
seklinde kullanmalisiniz.)
> Kablom dogru yapida iki ucu disi bir connector,bir ucu
> COM1'de diger ucu COM2'de
>
> ama VMIN ve VTIME ayarlari nedir ?
> Nasil ayarlanir ?
> Bunlar hakkinda biraz bilgi var mi?
>
VMIN ve VTIME, port ayarlari icin kullanabileceginiz
bircok degerden yalnizca ikisi ile ilgilidir. Tanimlari
<termios.h> baslik (=header) dosyasinda ya da onun alt
dosyalarinin birinde bulunur, (ornegin <bits/termios> ).
"termios" struct'inin elemanlari arasinda yer alan
"c_cc[NCCS]" dizisine deger atarken "indis" olarak
kullanilir.
...
cc_t c_cc[NCCS]
...
Deger atamaya ornek :
newtio.c_cc[VTIME] = 0;
/* inter-character timer unused */
/* Karakterler-arasi zamanlayici... bu ornekte
etkisizlestirilmis [=0] durumda */
newtio.c_cc[VMIN] = 1;
/* blocking read until 1 character arrives */
/* "read" in en az kac karakter okumakla
yetinecegini belirler; [=1] olunca, program
akisi porttan en az 1 karakter okunana kadar
read'in altina dusmez. */
> "ve okunan karakteri CR ve/veya LF yonunden
> denetleyerek (gondericinin katar sonunda
> boyle bir karakter gonderecegi varsayimiyla)
> bu karakteri gorunce de, katari tamamlanmis
> sayip, onu kullandiktan ve sifirladiktan
> sonra yeniden donguye gecerek"
>
>
> demissiniz.
>
> Burada katari sifirlamakla ne kastediyorsunuz.
> Anladigim kadari ile CANONIC formda bir buffer var ve
> benim bu buffer'i silmem lazim
char katar[256];
gibi bir diziniz (=array) olsun...
read ile her seferinde 1 karakter okuyarak ve kendinize
while dongusu icinde bu karakterleri tek tek denetleme
sansi tanidiginizi varsayarak dusunuyorum...
En basta sifirladiginiz (null deger atadiginiz) dizi
baslangictaki gorunumu ile soyledir:
- - - - - - - - - ...
Siz karakterleri birer birer porttan okutup diziye
yerlestirdikce gorunum su hal alir :
K - - - - - - - - .... (Dongu - 1)
K a - - - - - - - .... (Dongu - 2)
K a t - - - - - - .... (Dongu - 3)
K a t a - - - - - .... (Dongu - 4)
K a t a r - - - - .... (Dongu - 5)
K a t a r 1 - - - ... (Dongu - 6)
Her seferinde porttan birer karakter okumak, olabilecek
tek yontem degildir elbette. Ama yukarida da yazdigim
gibi, her bir karakteri okur okumaz denetleme sansi
verdigi icin bence en esnek ve verimli yoldur.
Ozellikle (satir sonu [=CR/LF] gibi) ozel karakterleri
denetleyebilmek oldukca onemlidir.
Iste katari sifirlamaktan kastim da bununla ilgiliydi.
Yani, zaten en basta sifirlamis olacaginiz katari(=diziyi)
karsi cihazin (veya portun) gonderdigi her satir
tamamlandiktan sonra, bu bilgiyi dilediginiz gibi
kullanip, ardindan yeniden sifirlayip donguyu basa almak.
Tabii, portu dinlemede kalabilmesi icin programin tum bu
isleri daha ust seviyede bir sonsuz-dongu icerisinde
yapmasi gerekir.
Serial-Programming-HOWTO'daki
"3.2. Non-Canonical Input Processing" baslikli bolumu,
oradaki VMIN/VTIME kombinasyonlarinin ne anlama gelecegi
aciklamasini ve devamindaki program kodu ornegini
incelemenizi oneririm. Ozellikle de;
tcgetattr(fd,&oldtio); /* save current port settings */
...
...
tcsetattr(fd,TCSANOW,&newtio);
arasindaki bolumu... Ki bu bolum ayni zamanda sizin
porta yazmak icin kullanacaginiz programin da temelini
olusturacaktir. Tabii okumaya degil, yazmaya yonelik
yapacaginiz ufak tefek degisikliklerle...
Bu mesajda, size yardimci olmakla "Yardim etmek istiyorsan
onun icin balik tutma, balik tutmayi ogret" felsefesi
arasinda denge kurmaya calistim. Ne olcude basarabildim
bilemiyorum.
Kolay gelsin.
---------------------------------
Do you Yahoo!?
Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes