From: Serdar KÖYLÜ (serdarkoylu@fisek.com.tr)
Date: Mon 11 Aug 2003 - 15:01:28 EEST
Selamlar..
fcntl ile seri port cihazini asenkron kullanin. Temelde tty IO lari
kernel tarafindan buffering icin kullanilir. Bu yuzden user space'den
erismek dogru degildir.
Cihazi asenkron acarsaniz, daha sonra SIGIO gibi sinyalleri beklersiniz.
Seri porta bilgi geldiginde veya port bilgi gondermeye hazir oldugunda
size bir sinyal gelir. Sizde bu sinyalin handleri icinde gerekeni
yaparsiniz.
Asenkron I/O ve non-blocking konularini inceleyin. fcntl ile bir dosyayi
asenkron calisir hale getirirseniz, read dediginizde sizi bilgiyi
almaniz icin beklemez, EAGAIN ile doner cabucak. Bilgi alinacak kadar
hazir olunca, SIGIO sinyali yollanmasini saglar:
#define FASYNC O_NONBLOCK | O_APPEND
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL, FASYNC);
Boylece portu asenkron I/O yaptik. Seri port oldugu iicn kafaniz
karismasin. Asenkron UART'lar kernelin isi. Bizim icin bu bir cihaz.
Dahasi bir soket veya dosya da olabilir, diskin okumasini beklemekle
vakit kaybetmezsiniz. Simdi porttan bilgi bekleyelim:
int bekle;
int main(...)
{
bekle = 1;
while (cik==0) {
. sleep(1); /* Uyusunda buyusun demeyeceksiniz boyle elbet.
Burada diger islerinizi yapabilirsiniz */
. if (bekle==0) {
. bytes = read(fd,buf,1024);
. buf[bytes]=0;
. printf("%d bytes alindi iste onlar: %s\n", bytes, buf);
. if (falancafilanca) cik=1;
. bekle = 1; /* bir sonraki girdiyi bekle */
. }
. }
}
Simdide bir signal handler:
void signal_handler_Serial_IO (int status)
{
printf("Birileri bize bir seyler yolluyor..\n");
bekle = 1;
}
Elbette signal handleri set edeceksiniz, termios struct ile port hizini
vs. ayarlayacaksiniz vs. vs. Tek fark, read ile okumuyorsunuz. Portu
kendi basina birakiyorsunuz. Porta bilgi gelince sinyal sizi
uyandiriyor. Bizim kodumuzda orenk bir dongu var. Ama bunun olmasi
gerekmiyor. Siz on planda isinize bakin. Seri porttan bilgi gelnce ne
yapilacagini dogrudan handler icinde de yapabilirsiniz. Ama burada tipki
ISR'lerde oldugu gibi, suratle geri donmek uzere bilgiyi alin bir
buffere yazin, bir flag kullanarak ana kodun onu islemesini saglayin.
Seri port kendine bilgi geldigi zaman IRQ uretir. Demekki, bu signal
handler tipki ir ISR gibi sizin isinizi gorebilir..
Saygi ve sevgiler..
On 11 Aug 2003 09:55:18 +0300
Muhammed Daud <muhammed@kilavuz.net> wrote:
> merhaba
> ben olsam interrupt 8`i kullanirdim
> saniyede 18.2 kere bilgisayarin saatini ayarliyor
> bunun yolunu degistirirseniz seri portu kontrol edip daha sonra saati
> ayarlayabilir
> On Sat, 2003-08-09 at 19:46, Derya Sezen wrote:
>
> > Merhaba,
> >
> > ttyS0 'a veri yazilip yazilmadigini interrupt olarak nasil
> > alabilirim!? termios struct'ini nasil kullanmam gerekmekte, fikri
> > olan?