USB Portunu dinlemek

Başlatan baran123, 23 Temmuz 2014, 11:49:53

baran123

Merhabalar pıcıle ıle olctugum sıcaklıgı pc e gonderen bır devre var ama usb yı cıkarınca c# arayüzünü acıp kapatmam gerekiyor bu sorunu usb portunu dinleyerek çözebilir mişim yani cihazı cıkarınca usb portunu sureklı kontrol edecek takınca algılayıp bır evente gırecek nasıl yapabılırım bıraz bakındım ama bır sey bulamadım assagıda kodlar var

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 UsbLibrary;

namespace USB_Termometre
{
    public partial class Main : Form
    {
        byte[] RecievedData = new byte[65];
        byte Tam = 0;
        byte Onda = 0;
        bool durum = false;
        public Main()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            this.usbHidPort1.ProductId = Int32.Parse("1111", System.Globalization.NumberStyles.HexNumber);
            this.usbHidPort1.VendorId = Int32.Parse("1111", System.Globalization.NumberStyles.HexNumber);
            usbHidPort1.CheckDevicePresent();
            if (durum)
            {
               toolStripStatusLabel1.ForeColor = Color.Green;
               toolStripStatusLabel1.Text = "USB Bağlantısı Kuruldu";
            }
            else
            {
              toolStripStatusLabel1.ForeColor = Color.Red;
              toolStripStatusLabel1.Text = "USB Bağlantısı Bekleniyor";
            }
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            usbHidPort1.RegisterHandle(Handle);
        }
        protected override void WndProc(ref Message m)
        {
            usbHidPort1.ParseMessages(ref m);
            base.WndProc(ref m);
        }
        private void usbHidPort1_OnDataRecieved(object sender, DataRecievedEventArgs args)
        {
            if (InvokeRequired)
            {
                try
                {
                    Invoke(new DataRecievedEventHandler(usbHidPort1_OnDataRecieved), new object[] { sender, args });
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            else
            {
                RecievedData = args.data;
                Tam = RecievedData[2];
                Onda = RecievedData[3];
                label2.Text = "Sıcaklık : " + Tam.ToString() + "," + Onda.ToString() + "°C";
            }
        }

        private void usbHidPort1_OnDataSend(object sender, EventArgs e)
        {
            
        }

        private void usbHidPort1_OnDeviceArrived(object sender, EventArgs e)
        {
          
        }

        private void usbHidPort1_OnDeviceRemoved(object sender, EventArgs e)
        {

        }

        private void usbHidPort1_OnSpecifiedDeviceArrived(object sender, EventArgs e)
        {
            toolStripStatusLabel1.ForeColor = Color.Green;
            toolStripStatusLabel1.Text = "USB Bağlantısı Kuruldu";
            durum = true;
        }  
        private void usbHidPort1_OnSpecifiedDeviceRemoved(object sender, EventArgs e)
        {
            toolStripStatusLabel1.ForeColor = Color.Red;
            toolStripStatusLabel1.Text = "USB Bağlantısı kesildi";
            label2.Text = "Sıcaklık : --,-°C";
            durum = false;
        }
        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Çıkış yapmak istediğinizden emin misiniz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (result == DialogResult.Yes)
            {
                Environment.Exit(1);
            }
        }    
    }
}


usb tekrar takılınca suraya gelmesını ıstıyorum
private void usbHidPort1_OnDataRecieved(object sender, DataRecievedEventArgs args)
        {
            if (InvokeRequired)
            {
                try
                {
                    Invoke(new DataRecievedEventHandler(usbHidPort1_OnDataRecieved), new object[] { sender, args });
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            else
            {
                RecievedData = args.data;
                Tam = RecievedData[2];
                Onda = RecievedData[3];
                label2.Text = "Sıcaklık : " + Tam.ToString() + "," + Onda.ToString() + "°C";
            }
        }

Burak B

Asenkron USB dinleme yapacaksın. Kullandığın USB kütüphanesinin nasıl çalıştığını iyi anlamaya çalış. Firmware tarafında da USB haberleşme hatası oluşursa USB yi devre dışı bırak ve yeniden initialize et. Yoksa işletim sistemi takılabilir.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

mur@t

#2
Linkteki örneği incelemenizi tavsiye ederim.

http://skyblg.wordpress.com/2013/08/28/c-hid-usb-ornegi/

cengav4r

#3
Bende Usb portu dinlemek istiyorum, raw data olarak. Yani serialportta nasıl serialport.ReadLine() varsa onun gibi. Yukarıdaki örneğe baktığımızda RecievedData datayı textbox göndermek istiyorum.
PIC tarafından gidenler
         usb_put_packet(1, bytedizisi,64, USB_DTS_TOGGLE); 
         usb_put_packet(1,chardizisi,32,USB_DTS_TOGGLE);   
         usb_put_packet(1,stringdizisi,32,USB_DTS_TOGGLE);   //gider mi bilmiyorum


Şimdi C# tarafından ReceivedData'yı  ReceivedData[0],ReceivedData[1].... diyerek okutmak istemiyorum usb'den ne geliyorsa görmek istiyorum.
Şimdiden teşekkürler

Düzeltme:
picden
  usb_put_packet(1, bytedizisi,64, USB_DTS_TOGGLE);   //C#da tarafından okunuyor
  usb_put_packet(1,chardizisi,32,USB_DTS_TOGGLE);     //C# tarafından okunmuyor
gönderdiğimde bytedizisi okunurken, char dizisi okumadı. Pic den C#'a char ve byte dizisi gönderirken C#'da nasıl ayırt edeceğiz?