Usb Hid UsbLibrary.dll Baglanma problemi

Başlatan rree, 17 Ekim 2012, 23:08:38

rree

     Arkadaşlar bir haftadır uğraşıyorum. Çözemedim
        Bu dll in reciver  kesmesi olduğundan beyenmiştim.
UsbLibrary.dll  bir çok örnek indirdim denedim .   VendorId=&H 1111  ProductId =&H 1111
Şeklinde hem ccs hem de C# da ve  Vb.net  de denedim baglandı diyor data alış verişi yapmıyor?

   Yanlışlıkla  VendorId=&H 0000  ProductId =&H 0000  atamışım bu ayarda  dataları alıyor.
CCS tarafındaki konfirigasyon ProducId ve VendorId istersen başka değerler ata  yine çalışıyor.

Arkadaşların çalışan örneklere bakıyorum bu dll kullananlar hep aynı. Çalışan programları baktığımda VendorId=0 ProductId =0 değerinde. Değer atayanların örnekleri çalışmıyor. Proteus deniyorum
        private void Form1_Load(object sender, EventArgs e)
        {
            //CheckForIllegalCrossThreadCalls = false;
            this.usb.ProductId = Int32.Parse("0000", System.Globalization.NumberStyles.HexNumber);
            this.usb.VendorId = Int32.Parse("0000", System.Globalization.NumberStyles.HexNumber);
            usb.CheckDevicePresent();
            //goster();

                Bu ayarda çalışıyor ama Pic tarafındaki VendorID  ProductId  farketmeden.



muhittin_kaplan

cihaza yüklediğiniz programın içerisinde VID ve PID bilgilerini içeren bir configuration dosyası olmalı. bunun içerisine yazılan VID ve PID nin PC deki programa yazılan VID ve PID ile aynı olması gerekir.
(hex binary decimal dönüşümü gerekebilir)

rree

#2
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==1
         0x01, //the constant DEVICE (DEVICE 0x01)  ==2
         0x00,0x02, //usb version in bcd 
         0x00, //class code ==5
         0x00, //subclass code ==6
         0x00, //protocol code ==7
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==8
         0x11,0x11, //vendor id 
         0x11,0x11, //product id 
         0x00,0x01, //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==15
         0x02, //index of string descriptor of the product  ==16
         0x00, //index of string descriptor of serial number  ==17
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==18
   };
 
Pic tarafındaki CCS ile yazımış ayarlar. Bunlar Hex tanımlı. C# tarfında Hex Olarak 1111 yazdım
Çalışmadı.  Onluk tabanda 4369  Yazdım yine bağlandı diyor başka bir şey yok. 0000 atarsam başlıyor data almaya. Pc tarafında aynı ayrları  umng.dll  li programda problem yok.

muhittin_kaplan

6017 ve 2000 decimal değerleri microchipin. hex e çevirip pic e ve bu değerlerle decimal olarak pc de denermisin. ama garip bir durum var.

rree

#4
6017=0x1781    2000=07D0
Imports System.ComponentModel
Imports System.Text
Imports System.Globalization
Imports System
Imports System.Threading
Imports UsbLibrary
Public Class Form1
    Inherits Form
    Private usb As New UsbHidPort
    Private VendorID As Short = Short.Parse("1781", NumberStyles.HexNumber)
    Private ProductID As Short = Short.Parse("07D0", NumberStyles.HexNumber)
    Private my_buffer(64) As Byte
    Private gelen_buffer(64) As Byte
    Public Sub New()
        InitializeComponent()
        usb.VendorId = 6017
        usb.ProductId = 2000

        'usb.ProductId = 4369 'ProductID
        'usb.VendorId = 4369 'VendorID
        AddHandler usb.OnSpecifiedDeviceArrived, AddressOf usb_OnSpecifiedDeviceArrived
        AddHandler usb.OnSpecifiedDeviceRemoved, AddressOf usb_OnSpecifiedDeviceRemoved
        AddHandler usb.OnDeviceArrived, AddressOf usb_OnDeviceArrived
        AddHandler usb.OnDeviceRemoved, AddressOf usb_OnDeviceRemoved
        AddHandler usb.OnDataSend, AddressOf usb_OnDataSend
        AddHandler usb.OnDataRecieved, AddressOf usb_OnDataReceived
        'usb.OnDataReceived += New UsbLibrary.DataReceivedEventHandler(usb_OnDataReceived)
    End Sub
    Private Property InvalidHandleException As Message
    Protected Overloads Overrides Sub OnHandleCreated(ByVal e As EventArgs)
        MyBase.OnHandleCreated(e)
        usb.RegisterHandle(Handle)
    End Sub

    Protected Overloads Overrides Sub WndProc(ByRef m As Message)
        usb.ParseMessages(m)
        MyBase.WndProc(m)
        ' pass message on to base form
    End Sub
    'Private Sub usb_OnDataReceived(ByVal sender As Object, ByVal args As DataRecievedEventArgs)
    Private Sub usb_OnDataReceived(ByVal sender As System.Object, ByVal args As UsbLibrary.DataRecievedEventArgs)
        ' Private Sub usbHidPort1_OnDataRecieved(ByVal sender As Object, ByVal args As DataRecievedEventArgs)
        If InvokeRequired Then
            Try
                Invoke(New DataRecievedEventHandler(AddressOf usb_OnDataReceived), New Object() {sender, args})
                'Invoke(New DataReceivedEventHandler(AddressOf usb_OnDataReceived), New Object() {sender, args})
            Catch ex As Exception
                Console.WriteLine(ex.ToString())
            End Try
        Else

            gelen_buffer = args.data
            Me.ListBox1.Items.Add(gelen_buffer(2).ToString() & "," & gelen_buffer(3).ToString() & "°C")
        End If
    End Sub

    Private Sub usb_OnDataSend(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MsgBox(" UsbHidPort1_OnDataSend ")
    End Sub

    Private Sub usb_OnDeviceArrived(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Me.ListBox1.Items.Add("Found a Device")
    End Sub

    Private Sub usb_OnDeviceRemoved(ByVal sender As System.Object, ByVal e As System.EventArgs)
        If InvokeRequired Then
            Invoke(New EventHandler(AddressOf usb_OnDeviceRemoved), New Object() {sender, e})
        Else
            Me.ListBox1.Items.Add("Device was removed")
        End If
    End Sub

    Private Sub usb_OnSpecifiedDeviceArrived(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Me.ListBox1.Items.Add("My device was found")

        'setting string form for sending data
        Dim text As String = ""
        For i As Integer = 0 To Me.usb.SpecifiedDevice.OutputReportLength - 2
            text += "000 "
        Next
        Me.ListBox1.Text = text
    End Sub

    Private Sub usb_OnSpecifiedDeviceRemoved(ByVal sender As System.Object, ByVal e As System.EventArgs)
        If InvokeRequired Then
            Invoke(New EventHandler(AddressOf usb_OnSpecifiedDeviceRemoved), New Object() {sender, e})
        Else
            Me.ListBox1.Items.Add("My device was removed")
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try

            usb.VendorId = Int32.Parse("1781", System.Globalization.NumberStyles.HexNumber)
            usb.ProductId = Int32.Parse("07D0", System.Globalization.NumberStyles.HexNumber)

            'usb.VendorId = Int32.Parse("0000", System.Globalization.NumberStyles.HexNumber)
            'usb.ProductId = Int32.Parse("0000", System.Globalization.NumberStyles.HexNumber)

            usb.CheckDevicePresent()
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            Dim text As String = Convert.ToString(Me.TextBox1.Text) & " "
            text.Trim()
            Dim arrText As String() = text.Split(" "c)
            Dim data As Byte() = New Byte(arrText.Length - 1) {}
            For i As Integer = 0 To arrText.Length - 1
                If arrText(i) <> "" Then
                    Dim value As Integer = Int32.Parse(arrText(i), System.Globalization.NumberStyles.Number)
                    data(i) = CByte(Convert.ToByte(value))
                End If
            Next

            If Me.usb.SpecifiedDevice IsNot Nothing Then
                Me.usb.SpecifiedDevice.SendData(data)
            Else
                MessageBox.Show("Sorry but your device is not present. Plug it in!! ")

            End If
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
    End Sub
End Class


Pic tarafı
0x00, //protocol code ==7
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==8
         0x81,0x17, //vendor id 6017=0x1781
         0xD0,0x07, //product id 2000=07D0
         0x00,0x01, //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==15
         0x02, //index of string descriptor of the product  ==16
         0x00, //index of string descriptor of serial number  ==17
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==18
   };

Buton 0000 değerini ayarladım butona basarsam data alıyor.

rr

Usb uygulamasında "usbLibrary.dll " kullanan arkadaşlar kontrol edib sonuçlarına dönseler prroblemin nereden kaynaklandığı belli olur.  reciver kesmesi düzgün çalışan bir dll tanıtılsa tüm arkadaşlar yararlanır.

t2

reciver kesmesini sallamışsınız gibi.  nerede bu kesme ?

rree

#7
Dört beş tane örnek buldum recever kesmesi olanda vardı. Aynı problem ile karşılaştım. Sizin örneklerde ProtectID ve  VendorID değer verdiğniz bağlanıyor. Pic tarafındaki değerler ile eşleşmediği zaman bağlantı kopuyormu.

Ben bunu C# kotlarından çevirmiştim. Recever kesmesi nasıl olmalı?

t2

#8
PC tarafında öyle bir kesme yok ki. usb veya paralel portla ilgili kesme 98 zamanında mı ne varmış. Kesme dediğiniz başka bir şey olmasın?

rree

#9
Eskiden kalma alışkanlık. Nesne tabanlıda  bir olay sonucu otamatik çalışan prosodur. Mesela Mouse click.
benim demek istediğim  usb ye bir bilgi geldiğinde otamatik alması. Umng.dll  master şeklinde çalışıyor. Pc tarafı sorarsa cevab geliyor.  Usblibrary.dll pic tarafı bilgi gönderirse otamatik alıyor.
            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";
            }
        }

              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 = Tam.ToString() + "," + Onda.ToString()+"°C";
            }

Bu örnektede aynı  problem var.

mesaj birleştirme:: 19 Ekim 2012, 11:50:22

   Proteus  den kaynaklanabilirmi?