[linux-programlama] Re: Portlara erişim

---------

From: Kenan Dogan (kndogan@yahoo.com)
Date: Fri 09 Jan 2004 - 08:08:47 EST

  • Next message: admin@linuxdestek.com: "[linux-programlama] Re: Linux Destek Merkezi"

     
    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


  • Next message: admin@linuxdestek.com: "[linux-programlama] Re: Linux Destek Merkezi"

    ---------

    Bu arsiv hypermail 2.1.6 tarafindan uretilmistir.