USB HID uygulamada bağlantı koptuğunda event yakalama

Başlatan fthsev, 20 Mart 2014, 11:48:27

fthsev

Arkadaşlar bilgisi olan arkadaşlardan cevaplamalarını rica ediyorum. C# da bir arayüz yaptım ve pic 4550 haberleştirdim. Bağlantıda ve veri alışverişinde hiç bir problem yok. Bir süre sonra arayüzden bağlantıyı kesmeden HID cihazı çıkarınca programın bunu yakalayarak bağlantı kesildi demesini istiyorum. Şu an cihaz hala bağlantı var gibi kabul edip pipe ye veri gönderiyor.

z

C# bilmiyorum. Delphi ye sonradan eklenen USB komponentinde Attach ve detach fonksiyonları var.

USB cihazı taktığında ve söktüğünde otomatik olarak çalışıyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fthsev

Evet C#da da aynı komutlar var. OnDeviceAttached ve OnDeviceDeteched ama bu komutları çalıştıramadım.

SpeedyX

Kurulumda event olarak += şeklinde ekleme yapmalısın yani event kurmalısın. Kurulu gelmiyor.

yusuffyk

hocam şöyle bir kod işinize yarayacaktır.
ben böyle kontrol ediyorum.

tabi kullanığınız referansa göre değişiklik gösterebilir.

private void OnChangeDeviceState(object sender, DeviceStateChangeEventArgs e)
{

if (e.CurrentState == DeviceState.Closed)
            {
                                // Bağlantı Kesildi
            }

}
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

fthsev

Z ve SpeedyX ilgilendiğiniz için teşekkür ederim. SpeedyX ben c# 2010 express sürümünü kurmuştum. Orada böyle bir ayar dikkatimi çekmedi. Bunu ayrı bir toolbox olarak yükleyebiliyormuyuz. yktronik yazdığım kod aşağıda . Burada senin dediğin kısım benim kodda da var. İlginç bir durum olarak o kısım bağlan butonuna bastığımda çalışıyor. Ama daha sonra cihazı çıkardığımda çalışmıyor. Aynı şekilde diğer event lerde ne cihaz takıldığında ne de çıkarıldığında çalışıyor.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using USBManagement;
using System.IO;
//using System.Threading;




namespace BileklikUSB
{
    public partial class Form1 : Form
    {

        UsbHidDevice dev = new UsbHidDevice();
        const short VendorID = 0x1111;
        const short ProductID = 0x1111;
        int index;
        
        
        byte[] gonder = new byte[64];

        public Form1()
        {
            InitializeComponent();
            dev.DeviceStateChanged += new DeviceStateChangeEventHandler(OnChangeDeviceState);
           
               
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            label1.Text = "BAĞLANTI BEKLENİYOR....";

        }

        
        private void OnChangeDeviceState(object sender, DeviceStateChangeEventArgs e)
        {
            
            

            if (e.CurrentState == DeviceState.Opened)
            {
                label1.Text = "BAĞLANTI KURULDU";
            }
            else if (e.CurrentState == DeviceState.Closed)
            {
                label1.Text = "BAĞLANTI KESİLDİ";
            }
            else if (e.CurrentState == DeviceState.Waiting)
            {
                label1.Text = "BAĞLANTI BEKLENİYOR...";
            }
            else if (e.CurrentState == DeviceState.Ready)
            {
                label1.Text = "BAĞLANTI HAZIR";
            }
            else
            {
                label1.Text = "BAĞLANTI YOK";
            }
        }
        private void OnDeviceAttached(object sender, EventArgs e)
        {
            bool Success;

            richTextBox1.Text += "Atached Device" + "\n";
            Success = dev.OpenPipe(VendorID, ProductID);
            if (Success)
            {

                richTextBox1.Text += "Bağlantı kuruldu" + "\n";

            }
        }
        private void OnDeviceDetached(object sender, EventArgs e)
        {
            richTextBox1.Text += "Detached Device" + "\n";
            if (dev.IsOpen) dev.ClosePipe();

            richTextBox1.Text += "Cihaz ile bağlantı kesildi" + "\n";

        }

        //private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        //{
        //    try
        //    {
        //        if (dev.IsOpen)
        //            if (dev.ClosePipe())
        //                richTextBox1.Text += "Akis borusu kapatildi"+"\n";
        //            else
        //                richTextBox1.Text += "Baglanti kapatilamiyor.."+"\n";

        //        if (dev.IsRegistered) dev.UnRegisterDevice();
        //    }
        //    catch (Exception err)
        //    {
        //        MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //    }
        //}

        //public delegate void okuhandler ();
        
        private void button1_Click(object sender, EventArgs e)
        {
            if (!dev.IsOpen)
            {
                if (dev.OpenPipe(VendorID, ProductID))
                {
                    richTextBox1.Text += "Aygıt bağlı. Veri bekleniyor..." + "\n";
                    ////Thread thread1 = new Thread(new ThreadStart(BaglantiKontrol));
                    ////thread1.Start();
                    ////richTextBox1.Text += "Thread çalıştı" + "\n";
                    //System.Threading.Thread tryRead = new System.Threading.Thread(new System.Threading.ThreadStart(VeriBekle));
                    //tryRead.Start();

                }

                else
                {
                    richTextBox1.Text += "Aygıt bağlı değil..." + "\n";
                }
            }
            
        }

LukeSkywalker

#6
Hangi dll'i kullandiginizi bilmiyorum fakat şuradaki dll mukemmel çalisiyor.

fthsev

umng.dll kütüphanesini kullanıyorum. Linkini verdiğiniz UsbLibrary.dll elimde vardı ama hiç kullanmadım. Hemen deniyorum.

LukeSkywalker


yusuffyk

umng.dll kullanarak çalışıyorum ve eventler benimkiyle aynı.
tam olarak probleminiz nedir bilmiyorum ama ben de sorunsuz çalışıyor.
umng.dll yi başka bir yerden bulup kullanmanı önerebilirim.
olmadı hocamın da dediği gibi
USBLibrary.dll de alternatif olabilir. aynı mantıkla çalışıyor zaten.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

LukeSkywalker

umng.dll'de cihazın bağlanması ve sökülmesi halinde event oluşturabiliyor musunuz @yktronik?

yusuffyk

#11
evet ben oluşturabiliyorum. bir sıkıntım olmadı şu ana kadar.
hatta buraya yükledim. ben bunu sorunsuz kullanabiliyorum. bunu referans olarak dener misiniz ?
http://yadi.sk/d/_ptP38MCKuEwq
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

LukeSkywalker

Ben bütün herşeyi denememe rağmen o eventları çalıştıramadım. Eğer mümkünse çalışan basit bir proje dosyası gönderebilir misiniz?

yusuffyk

.dll dosyasını ekledim, şu an da biraz meşgulüm, eğer çalıştıramazsanız ilerleyen saatlerde ekleyebilirim.
http://yusuffyk.com  ||  http://www.youtube.com/yusuffyk

LukeSkywalker

Bu dll benim kullandığım ile aynı. Yine de değiştirerek denedim. Fakat bağlantı sağlandığında otomatik olarak bunu algılayan event yine çalışmadı. İllaki ben usb soketine cihazı taktığımda butona basarak iletişimi başlatıyorum. Cihazın takıldığını otomatik olarak algılamıyor.