Forum: Ders Arası RSS
Durum kapısından ("port") veri okuma
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 984 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Durum kapısından ("port") veri okuma
Aslında bu konu için uygun başlık seçemedim. O yüzden en iyisi yaptığı işlemi yazayım dedim. Yaptığı işlem durum kapısı ("status port") bağlı düğmelerden gelen verileri okumak.

Ama benim asıl sorunum bunu okumakla değil de çıktının değişmeden alt satırlara geçmesini sağlamak. Örneğin çıktı şunun gibi oluyor:

Durum: 00100000

Benim istediğim bunu tekrar alt satırlara yazmadan olduğu yerde değiştirsin. Aslında bu konuda dershanede bir örnek vardı. Hatta ben bu örneği yaptığımı da hatırlıyorum. Ama kitabı 3-4 kere aramama rağmen bir türlü bu örneği bulamadım. Sanırım biraz kafam karıştı  :huh:

import std.stdio;
import girişçıkış;
 
const uint durum = 0x0c001;
 
void göster(uint sayı)
{
    writefln("Durum : %08b", sayı);
}        
 
void main() 
{
    erişimhakları(durum,1,1);
    uint önceki;
 
 
    while (true) {
        uint okuduğum = oku(durum) ^ 128;
        
        if (önceki != okuduğum) {
            göster(okuduğum);
            önceki = okuduğum;    
        }
    }
}
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
'\r' satır başına götürür. Hazır Değerler bölümünün çözümlerinde gizliymiş:

  http://ddili.org/ders/d/hazir_degerler.cozum.html

Pardon.  :blush:

Ali
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 984 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler. Tam olarak aradığım bu örnekti  :-)

Ama denediğim zaman o örnekteki gibi çalışıyor. Ama ben istiyorum ki durum bitleri değiştiği zaman yani kullanıcı bir düğmeye bastığı zaman ekrana bir şey yazsın. Eğer kullanıcı bir düğmeye basmamışsa ortalıkta fır fır gezinmesin  :-p

// girişçıkış.d

import std.stdio;
import core.bitop;
 
alias outp yaz;
alias inp oku;
 
alias ioperm erişimhakları;
 
extern(C)
{
/*
   void outb (ubyte value, ushort port)
    {
        asm 
        {
            mov AL, value;
            mov DX, port;
            out DX, AL;
        }
    }
*/
 
    int ioperm (ulong __from, ulong __num, int __turn_on) ;
}

// verigirişi.d
import std.stdio;
import girişçıkış;
 
const uint durum = 0x0c001;
 
void göster(uint sayı)
{
    writef("\rDurum : %08b", sayı);   
}        
 
void main() 
{
    erişimhakları(durum,1,1);
        uint okuduğum, önceki;
        
        /* 
           Bu kısımdaki gibi kullanmaya çalıştığım zaman
           yani durum bitleri değiştiği zaman ekrana bir 
           şey yazacak şekilde değiştirdiğimde çalışmıyor ?!
           Sadece writefln kullanınca çalışıyor.            
        */
        /*         
        while(true)
        {
        okuduğum = oku(durum) ^ 128;
            if (okuduğum != önceki) { 
            göster(okuduğum);
                önceki = okuduğum;
            }
        }
        */
 
        while(true) {
            okuduğum = oku(durum) ^ 128;
            göster(okuduğum);    
        }
}
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Standart çıkış ara bellek kullandığı için karakterleri satır sonu görene kadar yazdırmıyor olabilir. Sanıyorum gereken stdout.flush():

import std.stdio;
import std.random;
import core.thread;
 
uint oku()
{
    Thread.sleep(dur!"msecs"(500));
    return uniform(0, 256);
}
 
void göster(uint sayı)
{
    writef("\rDurum : %08b", sayı);
    stdout.flush();
}
 
void main()
{
    uint okuduğum, önceki;
 
    while(true) {
        okuduğum = oku() ^ 128;
        if (okuduğum != önceki) {
            göster(okuduğum);
            önceki = okuduğum;
        }
    }
}

Ali
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 984 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Sanıyorum gereken stdout.flush():

Çok teşekkürler! :) Şimdi tam istediğim gibi oldu.

    int ioperm (ulong __from, ulong __num, int __turn_on) ;

Buradaki ulong parametrelerini de tekrar int yaptım.

core.bitop içerisindeki inp oku işlevi gibi bir çok işlev de parametre olarak uint alıyormuş.

https://github.com/D-Programming-Language/druntime/blob/ma…
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-23, 23:31:07 (UTC -08:00)