Usb hid veri gelmedğinde timeout hatası giderilebilirmi

Başlatan rree, 19 Haziran 2012, 00:15:39

rree

Led sondur yak projesini vb.net uyarladım. Led yakıp söndürüyor.Fakat ben her zaman pic bilgi göndermesini isitemiyorum. Css de pic veri göndermesini  erteliyorum.
my_hid.ReadPipe(gelen_buffer, 84, TransactionType.Interrupt)  satırında time out hatası veriyor.
Hatayı es geçmesi için On error goto xxxxx ve oneror resume next komutlarını kullandım. Bu eror komutunu bir defa işletirse bu sefer picden data gelse bile  dataları okumuyor.Çözüm önerilerinizi bekliyorum.

Private Sub btn_oku_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_oku.Click
        On Error GoTo BtnOkuHata


        If my_hid.IsOpen Then
            'OkuHandler my_oku = new OkuHandler(Oku);
            'my_oku.BeginInvoke(new AsyncCallback(IslemTamam), null);

            txt_okunan.Text = ""
            my_buffer(3) = AscW("o"c)

            If my_hid.IsWindowsXpOrLater Then
                my_hid.WritePipe(my_buffer, TransactionType.Interrupt)
            Else
                my_hid.WritePipe(my_buffer, TransactionType.Control)
            End If

            If my_hid.IsWindowsXpOrLater Then
                my_hid.ReadPipe(gelen_buffer, 84, TransactionType.Interrupt) ' Bu satırda time out hatası veriyor.

            Else
                my_hid.ReadPipe(gelen_buffer, 84, TransactionType.Control)
            End If

            txt_okunan.Text = Convert.ToString(gelen_buffer(2))

        Else
            txt_durum.Text = "Cihaz ile bağlantı yok!"
        End If
        GoTo BtnOkuson

BtnOkuHata:
        Exit Sub
BtnOkuson:

    End Sub

muhittin_kaplan

pic in data göndermesini engelliyorum derken, pooling yapmasını nasıl sağlıyorsunuz. yani usb cihaz bir müdder bilgi göndermrsze ve "ben buradayım" demezse PC cihazı deattach eder.

rree

Pic in data gönderme işini  porta yani butona bağladım.
   if(Input(Pin_Oku)==0)
         {
           Delay_ms(10);
           //Generate_tone(G_note[2],200);
Lab_Pinoku_Bekle1:
           if(Input(Pin_Oku)==0){goto Lab_Pinoku_Bekle1;}
           paket[0]=10;
           paket[1]=11;
           paket[63]=63;
           paket[64]=64;
           paket[65]=65;
           paket[83]=83;
           paket[84]=84;
           Delay_ms(10);
           usb_put_packet(UcNokta1, paket, 84, USB_DTS_TOGGLE);//84 Pakti  gonder
           Lcd_Mesaj_TestOkundu();

Mikro denetleyiciye optik okuma görevi sırasında usb yi cevab vermemesi gerkiyor.Optik okuma sırasında gecikmeler us  süresince önemli. Esasında meşgul pic den meşgul iletisi alabilsem olur.
-Bağlandıktan sonra data alış veriş yapmadan  1 dakika bekledim   pic deki butana bastım. sonra vb.net den okudum. Bağlantı problemi olmadı .  Win7 64 bit isis ile deniyorum. deattach  bir bağlantı problemi olmadı.Ancak picden veri göndermeden Vb.net den veri okumaya kalkarsam time out hatası alıyorum.

muhittin_kaplan

ccs bilmem. ama veri gönderilmediği zaman bağlantının kopmaması için bir "ben buradayım" komutunun olması gerek.

rree

Sizin dedğiniz muhakkak doğrudur.Usb cihazları bağlantı kuran cihazlar. Ana programdan hariç arka planda kesme oluşturup bağlantı sağlıyor olabilirmi. Ben sadece Paket dizisini gönderme kısmını butona bağladım.

z

Alıntı yapılan: rree - 19 Haziran 2012, 01:02:42
Ancak picden veri göndermeden Vb.net den veri okumaya kalkarsam time out hatası alıyorum.

PC Get Report ile cihazdan okuma isteginde bulunursa buna karsilik cihaz veri yollamazsa time out sure dolumunda hata verecek tabiki.

PC ile cihaz arasinda yazilimsal bir handshake mekanizmasi kurabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

rree

Epey uğraştım geçici bir çözüm buldum işimi görecek kotlar aşağıda.
 
-TimeOut değerini 0 atadım
- Hata oluştuğunda  Hata etiketine My_hid. close sonrada My_hid.open komutları ile tekrara bağlantı kurdum
- Şimdiki durum okuma butonuna basınca data yosa "0" değerini dönüyor vars ise pic deki değer ulaşıyor.
- Daha iyi çözüm bilen varsa, mesajlarını beklerim. İlgilenen arkadaşlara  teşekkür.

 
Private Sub btn_oku_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_oku.Click
        On Error GoTo ErrorHandler

        If my_hid.IsOpen Then
            'OkuHandler my_oku = new OkuHandler(Oku);
            'my_oku.BeginInvoke(new AsyncCallback(IslemTamam), null);

            txt_okunan.Text = ""
            my_buffer(3) = AscW("o"c)

            If my_hid.IsWindowsXpOrLater Then
                my_hid.WritePipe(my_buffer, TransactionType.Interrupt)
            Else
                my_hid.WritePipe(my_buffer, TransactionType.Control)
            End If

            my_hid.ReadTimeOut = 0
            If my_hid.IsWindowsXpOrLater Then

                'my_hid.ReadPipe(gelen_buffer, 84, TransactionType.Control)
                my_hid.ReadPipe(gelen_buffer, 84, TransactionType.Interrupt)

            Else
                my_hid.ReadPipe(gelen_buffer, 84, TransactionType.Control)
            End If

            txt_okunan.Text = Convert.ToString(gelen_buffer(2))

        Else
            txt_durum.Text = "Cihaz ile bağlantı yok!"
        End If
        Exit Sub
ErrorHandler:
        If my_hid.IsOpen Then
            my_hid.ClosePipe()
        End If
        If (Not my_hid.IsOpen) Then
            If my_hid.OpenPipe(VendorID, ProductID) Then
            End If
        End If
        Exit Sub

    End Sub