c# seri porttan art arda gelen verileri farklı alanlara yazdırmak

Başlatan sahteker, 04 Mayıs 2011, 05:26:39

sahteker

Arkadaşlar günaydın,
çok fazla soru sordum galiba ama umarım forum sakinlerine bıkkınlık vermemişimdir  artık :(
ben bir noktaya daha takıldım c# da
rica etsem yardımcı olabilir misiniz?

proğramımın genel görünümü ekliyorum daha rahat açıklayabilmek için...
malumunuz çok kez söyledim ama tekrar edeyim: ben bu proğramı iki adet elektrik sayacını okuyabilmek için düzenlemeye çalışıyorum..
yine buradaki abilerimin ve arkdaşlarımın sayesinde çok yol katettim

[IMG]http://ressim.net/s/upload/c65417.bmp[/img]

AMACIM ŞU:
textbox lardan sayaçlarımın seri numaralarını seçeceğim ve seçtiğim sayaçtan okunan veriler altındaki bloklara yazılacak..
buraya kadar her şey normal
sayaçları birer birer taktığımdada her şey normal hangisi olursa olsun okuyabiliyorum...
iki sayacıda aynı anda bağladığımızda okumaya çalıştığımda ise 1. kolonda hangi sayacı seçmişsem yalnızca onu okuyabiliyorumher ikisi içinde geçerli bu durum..
2. kolona yani 2. sayaca geçerken ise sorun çıkıyor hep :(


buda bana olayın yazılımsal bir sorun olduğunu gösteriyor yanılmıyorsam...
onun için c# ile ilgilenen ustalarımdan yardım beklemekteyim :(

denediğim kodlar ise şunlar:
buralarda bir yerlerde hata yaptığımıza eminim bir de siz göz atabilir misiniz belki biz bişeyler kaçırıyoruzdur gözden:

birincisi:
        private void tm_Tick(object sender, EventArgs e) //sayaca sıra ile obis kodların atılması
        {
            if (index>=komutlist.Length)
            {
                index = 0;
                if (!ikinci)
                {
                    try
                    {
                        seriport.BaudRate = 300;
                        if (seriport.IsOpen) seriport.Close();
                        seriport.Open();
                    }
                    catch (System.IO.IOException ex)
                    {

                    }
                    ikinci = true;
                    komutlist[0] = "/?" + seri2.Text + "!" + (char)13 + (char)10;
                }
                else tm.Enabled = false;
                ikinci = false;
            }
            else if (index!=eskiindex)
            {
                eskiindex = index;
                gonder(komutlist[index]);
            }

        }
        string dtt = "";
        string[] buff=new string[1];
        int a = 0;


ikincisi:
        private void tm_Tick(object sender, EventArgs e) //sayaca sıra ile obis kodların atılması
        {
            if (index>=komutlist.Length)
            {
                index = 0;
                if (!ikinci)
                {
                    seriport.BaudRate = 300;
                    if (seriport.IsOpen) seriport.Close();
                    if (!seriport.IsOpen) seriport.Open();
                    ikinci = true;
                    komutlist[0] = "/?" + seri2.Text + "!" + (char)13 + (char)10;
                }
                else tm.Enabled = false;
                ikinci = false;
            }
            else if (index!=eskiindex)
            {
                eskiindex = index;
                gonder(komutlist[index]);
            }

        }
        string dtt = "";
        string[] buff=new string[1];
        int a = 0;


üçüncüsü:
        private void tm_Tick(object sender, EventArgs e) //sayaca sıra ile obis kodların atılması
        {
            if (index>=komutlist.Length)
            {
                index = 0;
                if (!ikinci)
                {
                    try
                    {
                        seriport.BaudRate = 300;
                        if (seriport.IsOpen) seriport.Close();
                        seriport.Open();
                    }
                    catch (Exception ioex) { }
                    ikinci = true;
                    komutlist[0] = "/?" + seri2.Text + "!" + (char)13 + (char)10;
                }
                else tm.Enabled = false;
                ikinci = false;
            }
            else if (index!=eskiindex)
            {
                eskiindex = index;
                gonder(komutlist[index]);
            }

        }
        string dtt = "";
        string[] buff=new string[1];
        int a = 0;


ilgilenen herkese şimdiden çok teşekkür ederim...
kimi, sevap için Kabeye varır... Kabe kapınızda! Bilmez misiniz?

sahteker

projemin elektronik aksamında yani donanımsal kısmında sorun olmadığını düşünmekteyim arkdaşlar
zira dediğim gibi her iki sayacıda (seçerek - istediğimizi )okuyabiliyoruz
eğer yanlışlık yada hatam 1. kolonun kodlarındaysa onlarıda ekleyebilirim
c# la ilginen arkdaşların yardımlarını beklemekteyim :(
şimdiden herkese teşekkür ederim...
kimi, sevap için Kabeye varır... Kabe kapınızda! Bilmez misiniz?

vitruvius

Kendi projem için yüzlerce sayfa okuduğumdan tam hatırlayamıyorum ama bir yerde bilgileri hafızada tuttuğundan yeni seçim için resetlemek gerektiği gibi bir şey söyleniyordu. Yanlış hatırlıyor da olabilirim, konuyla alakasız da olabilir ama belki yol gösterir =)

sahteker

konumuzla alakasız değil galiba hocam dedğiniz şey galiba BytesToRead özelliği
seri porta gelen verilerin sayısına yada kapasitesine bakıyor yanılmıyorsam
ama bizim asıl problemimiz bunun birazdada ilerisinde bence
çünkü iki saycıda okuyabiliyorum okuma noktasında herhangi bir sorunumuz yok sadece gelen verilerin
2. text box lara yazılmasını istemekteyim ben hocam :(

resetlemek derken neyi kastettiniz anlayamadım ama onuda araştırayım birazdaha
proğram içinde hafıza registerlerini mi reetlemek :S :(
yoksa seri porta takılı cihazları mı resetlemek  ?

eğer 2. ise söylediğiniz, buda yukarıdaki kısma giriyor zira okumayı yaparken ben bazen sayaçların çağrı tuşlarına basıyorum
buda garip bir şekilde faydalı oluyor galiba hocam çünkü okuma bazen durabiliyor sayaç mı kilitleniyor orasını tam anlayamadım
ama sonra hemen düzeliyor gene
bekide biz o oturum için bağlantıyı sonlandırmadğımda oluyor bu küçük sorun :(
zaten fazla önemi de yok dediğim gibi çağrı tuşlarını kullanabiliyorum ya da sayaçların enerjisini kesip yeniden verdimmi halloluyor
teşekkür ederim ilginiz için...

asıl bahsettiğim sıkıntının verdiğm kodların bi yerlerinde olduğuna eminim ;
büyük ihtimalle bunlardan birisinde bir düzeltme yapacğaız ama nerede ?:(
kimi, sevap için Kabeye varır... Kabe kapınızda! Bilmez misiniz?

salih18200

komutlist[0] = "/?" + seri2.Text + "!" + (char)13 + (char)10;


burada seri2.text sayaç seri numarasının bulunduğu text heralde seri2 isimli komponent hangisi birinci kolondakimi
yoksa 2. kolondaki seri numarası olan kutumu?

sahteker

2. text in içindeki veriler Salih hocam,
textlerin içine yazdığımız karakterleri ya da combo özelliğinden seçtiğimiz seri numarayı
(sürekli kullandığım ve denemeler yaptığım için iki sayacımın seri numarasını edit items den ekledim 1. comboda görünenlerde onlar)
/?   !
karakterlerinin arasına koyup networke gönderiyoruz
hangi sayacın seri numarası gönderilmişse ağa o sayaç farkına varıyor ve kendisiyle haberleşilmek istendğini anlıyor.
tek fark olarak baştaki o MSY harfeleri makel sayaçların özelliğinden kaynaklanan bi durum, seri numaranın başına koymamız gerekiyor sadece
kimi, sevap için Kabeye varır... Kabe kapınızda! Bilmez misiniz?

salih18200

sanırsam 2. sayacı okumak için timer kullanıyosun timer'ı nerde ne zaman start edip stop ediyosun göremedimde kodda?

sahteker

Salih hocam yanlış bilmiyorsam 2. sayaç için timer kullanmıyoruz belkide ben eksik biliyorumdur ama düzeni şöyle kurmuştuk biz:
sayaçların okunduğuna dair bir ACK karakteri var eğer ACK karakteri gelirse
bundan sonra gelen sorgu cevapları diziye kaydediliyor ve sıradaki sorgulara geçiliyor..
proğramda timer kullandık ama onun için mi kullandık ben tam bilmiyorum.

kod sayfamız 384 satır onun için hepsini kopyalamadım çok uzun diye ve hatanın burada olduğuna çok büyük ihtimalle eminim. :(
çünkü sonradan yaptığımız tek ekleme 2. kolondaki box lar
eğer isterseniz kodlardaki timer kısımlarınıda eklerim ama?
başarabilirsem tabi yada nereyi istediğinizi tam anlayabilirsem :(
kimi, sevap için Kabeye varır... Kabe kapınızda! Bilmez misiniz?

salih18200

private void tm_Tick(object sender, EventArgs e) //sayaca sıra ile obis kodların atılması


buradaki tm_tick timer tick anlamına geliyo diye biliyorum.. kodun tamamını ekleyin bence

yamak

back ground worker kullanmayı deneyin timer yerine.Paralel işlem yaptırmış olursunuz.

sahteker

Alıntı yapılan: yamak - 05 Mayıs 2011, 04:00:17
back ground worker kullanmayı deneyin timer yerine.Paralel işlem yaptırmış olursunuz.

çok teşekkür ederim hocam ilginiz için
biraz araştırdım backround worker ı paralel işlemler için kullanılıyormuş genelde yanılmıyorsam ama win işlemleri için :(

şöyle söyliyeyim:
bizim bu yapmaya çalıştığımız kodlar zaten kendi halinde nispeten yeterli oluyor
yani pro. dışı için galiba fazlasına ihtiyacımız yok gibi yanlış mıyım hocam?


bu arada çok ilginç bişey daha farkettim arkdaşlar. :o
yukarıda verdiğim kodlardan bence en stabil olanı en baştaki- en üstteki niye derseniz:
çünkü o iki sayaç arasındaki geçişte hiç hata vermeden devam ediyor.

tek sıkıntı ikinci sayaçtan gelen verileri de 1. bloğa yan 1.nini verilerinin üzerine yazıyor
bu verileri 2. bloğa yazmasını istiyoruz tek dileğimiz bu :(

proğram ilerleyişinde seri2.text içindeki bilgi (seri numara ) networke gönderildikten sonra yine bu verinin aynısını içeren (seri no. yu)bir bilgi düzgünce, sayacımızdan,  seri porttan proğramımıza geliyor ve kaydediliyor
İŞTE TAM BU NOKTAYLA BERABER BUNDAN SONRA GELEN VERİLERİ 2. bloğa yazdırmak istiyoruz
herkese yardımlarından ve ilgilerinden dolayı çok teşekkür ederim
kimi, sevap için Kabeye varır... Kabe kapınızda! Bilmez misiniz?