Avatar billede madsens90 Praktikant
11. august 2010 - 12:24 Der er 16 kommentarer

Read og Write til og fra HID Infrared device vil ikke virke?

Hej Eksperter!

Jeg håber virkelig at der er nogen der har tålmodighed til at få det her til at virke til mig, og da det er lidt mere avanceret end jeg troede, er der lige kommet lidt flere point på (hvis nogle skulle være interesseret).

Jeg har i nogle dage nu bogstaveligt talt uafbrudt forsøgt at få det her til at virke, men hver gang det er ved at virke, kommer der en stopklods, og jeg er nød til at begynde stort set forfra.

Jeg har et USB Infrarødt stik som jeg vil connecte til via C#, og så læse data derfra, og sende data dertil. Mit USB stik ligger i øvrigt under HID enheder, hvis nogle skulle være i tvivl. :)

Har fundet ud af at hvis man skal connecte til mit device via:
Vendor ID og Product ID.
I mit tilfælde er det:
Vendor ID: 0x045e
Product ID: 0x006d
De 2 oplysninger har jeg fået adgang til via det her program, som jeg har lagt på min ftp:
http://www.shax.dk/HidTest.exe (hvis nogle skulle være interesseret i det)

Jeg troede først at jeg var nød til at lave en virtuel COM port på mit usb stik for at connecte, og da jeg søgte hjælp til lavede jeg dette spørgsmål:

http://www.eksperten.dk/spm/915617

og efter ca 50 indlæg blev vi enige om at jeg skulle oprette et nyt spørgsmål. Men i må meget gerne kigge hvad vi nåede frem til!

Jeg forsøger lige nu at få det til at virke med hjælp fra denne side:

http://labs.mikeobrien.net/Document.aspx?id=hidlibrary

Har indtil videre fået lavet et program der tillader mig at connecte til mit device, og åbne forbindelse.
Og både funktionen 'IsConnected' og 'IsOpen' siger 'TRUE'.

Men når jeg forsøger at bruge funktionen HidDevice.Read() så "hænger" mit program bare, og jeg er nød til at afslutte DEBUG.
'HidDevice' er mit usb stik.

Er der nogen der ved hvad jeg kan gøre? Eller nogen der kender en bedre side til at lærer at lave en forbindelse til en HID enhed?

I får lige den stump kode jeg har:


        public HIDLibrary.HidDevice[] HidDeviceList;
        public HidDevice HidDevice;
        public HidDeviceData InData;

        private void connect_Click(object sender, EventArgs e)
        {

            HidDeviceList = HidDevices.Enumerate(0x045e, 0x006d);

            if (HidDeviceList.Length > 0)
            {

                // Grab the first device
                HidDevice = HidDeviceList[0];

                HidDevice.Open();
                Thread.Sleep(2000);

                // Check if connected...

                status.Text = "Connected: " + HidDevice.IsConnected.ToString() + "\r\n";
                status.Text += "Open: " + HidDevice.IsOpen.ToString() + "\r\n";
}
}

        private void receive_Click(object sender, EventArgs e)
        {
            try
            {
                InData = HidDevice.Read();
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.ToString());
            }
        }

Som i kan se har jeg en knap til at connecte, og en til at modtage data.
Når jeg trykker på connect knappen, viser den som sagt tidligere, at der er forbindelse til min enhed.
Men når jeg trykker på modtag knappen, hænger programmet til jeg lukker det.

På forhånd MANGE gange tak for hjælpen!

- Christian Madsen
Avatar billede heinzdmx Nybegynder
11. august 2010 - 13:13 #1
Jeg gætter på du har prøvet at sende input fra din Remote, efter du har trykket read? Sådan at den ikke bare venter på at der kommer en form for input?

Fandt lige den her kode:
http://nicholas.piasecki.name/blog/2008/11/reading-a-stamps-com-usb-scale-from-c-sharp/

Hvor det virker. Prøv det, det er endda lidt mere beskrivende med at dekode det man får igen.
Avatar billede madsens90 Praktikant
11. august 2010 - 14:01 #2
Hej igen heinzdmx. ;)

Det lykkedes mig ikke at få forbindelse til mit infrarøde stik med den kode, men det er lykkedes mig at få forbindelse til min USB mus.

Den siger dog at dataen jeg modtager er '0' på alle 8 bytes jeg modtager. ;)

Men den hænger ikke på den, hvorimod at den også hænger med den kode hvis jeg bruger mit Infrarøde USB stik.
Hvad mon jeg kan konkluderer ud fra det?

Jeg ved at det kan fungerer, fordi jeg kan se at programmet 'Device Monitoring Studio' godt kan modtage data fra mit usb stik som ønsket.
Avatar billede madsens90 Praktikant
11. august 2010 - 14:05 #3
Jeg har lige fundet den her side, med en fyr der bruger et 'eHome Infrared Transceiver' præcis ligesom mig! Og han skriver endda at hans device venter på data!
Hvilket vil sige at mit device ikke modtager nogen data? Eller ikke sender det videre korrekt til C#? eller?
Avatar billede madsens90 Praktikant
11. august 2010 - 14:19 #4
Avatar billede madsens90 Praktikant
11. august 2010 - 15:30 #5
Jeg har fået den til ikke at "hænge" mere!

Jeg kom til at tænke på at der måske kunne være tilføjet mere end ét device til min device liste.
Og rigtig nok. Lige så snart jeg skiftede nummer, så modtog jeg bytes.

Problemet er bare at jeg altid modtager 0 bytes, ligemeget hvad jeg gør.

Også selvom at jeg holder en knap på fjernbetjeningen nede mens jeg kører programmet...

Nogen idéer?
Avatar billede heinzdmx Nybegynder
11. august 2010 - 15:51 #6
Så lykkedes det da nogenlunde.

Vel, de fleste devices sender det jo i et array. Hvor der er flere bytes der bliver sendt, så du skal kunne modtage flere på en gang.

Når du trykker på en knap hvad er så det præcise du får af input? Her tænkes på dit USB Monitor, eller hvad det nu hed :D, hvor du kan se hvilke input der kommer, hvad er input så ved tryk på en knap
Avatar billede heinzdmx Nybegynder
11. august 2010 - 15:56 #7
Hvilke løsninger har du prøvet forresten?

Du er vel klar over at read ikke læser noget, men at du skal bruge OnReceive??
Avatar billede madsens90 Praktikant
11. august 2010 - 15:58 #8
Hvis jeg vælger at se "Raw Data", og bruger min fjernsyns fjernbetjening, og trykker på kanal 1 knappen så hurtigt jeg kan, så kommer der dette output som vidst på dette billede:

http://www.shax.dk/tast_1_packet.png

Kan godt følge dig i det med at der nok kommer flere pakker, men så er spørgsmålet hvordan jeg læser flere pakker af gangen, eller hvordan man nu skal sige det? :P
Avatar billede madsens90 Praktikant
11. august 2010 - 16:04 #9
Nej? Jeg er ikke klar over noget med OnReceive? :P

Hvilket et af de .NET libaries vi har brugt, er der OnReceive i?
Avatar billede heinzdmx Nybegynder
11. august 2010 - 17:34 #10
Sorry.. mig der huskede forkert :S

Som jeg ser det har du 2 muligheder:
- Kører en seperat tråd, så GUI kan blive ved med at køre på windows formen, og skulle bruge delegates osv. for at samtale med GUI tråden. Her skal du være opmærksom på at HidDevice.Close IKKE lukker ned for handles, så derfor vil den her tråd blive ved med at kører. Jeg tror dog at et workaround er at kalde Enviroment.Exit(), når du kalder en close på din form
- Kører det hele asyncront. Præcis som ham fra den tråd du tidligere skrev om, som havde fået det til at virke med hans IR, kalde Read, med nyt callback, der sender det videre til et eventarg der håndtere nye data, og så lukker Device, og så åbner det igen. Og kører det i et loop = kan give "svarer ikke" på dit program...


Hernede eksempel på det sidste - taget stortset fra den anden tråd:

private void Listen()
{
device.Read(new HidDevice.ReadCallback(OnDataReceived));
}
private void OnDataReceived(HidDeviceData hid_data)
{
if (this.DataReceived != null){this.DataReceived(this, new HIDDataEventArgs(hid_data));}
HidDevice.CloseDevice();
HidDevice.OpenDevice();
Listen();
}

Bemærk der mangler dit custom eventarg:
HIDDataEventArgs, den skal du selv lave.

Det med en anden tråd kan jeg også give et eksempel på, hvis du føler at du vil prøve det. Omend jeg ikke selv er den store mester i Thrading. Men hvis det var mig ville jeg prøve det, ide du undgår at du får en "svarer ikke" tilbage, selvom dit program bare arbejder.
Avatar billede heinzdmx Nybegynder
11. august 2010 - 17:45 #11
Har yderligere kigget det igennem og det ser ud til du også kan bruge:

ReadData(

HidDeviceData dd = HidDevice.ReadData(int Timeout)

Det skulle vist returnere et array af data.
Avatar billede heinzdmx Nybegynder
11. august 2010 - 17:57 #12
Forresten, ved ikke om du har set det, men til alle andre der måske ikke har:
http://hidlibrary.codeplex.com/SourceControl/changeset/view/9137

Klik på devices, og så videre til f.eks. MagtekCardReader. Her vil du se det kode der skal til for at læse fra sådan en kortlæser.
Tilpas den til det vi har fundet ud af indtil videre. Tror det vil være en del hurtigere end at prøve sig frem.

Kan se der bliver brugt OnReport og nogle andre funktioner man ikke lige støder på. Prøv at kig der, og se om der er noget i det.


MagtekCardReader er nok den mest relevante da den kun gør det vi skal -> læse
Avatar billede heinzdmx Nybegynder
11. august 2010 - 18:08 #13
Følgende array, har du vel prøvet på din InData:


for (int i = 0; i < inData.Data.Length; ++i)
{
    Console.WriteLine("Byte {0}: {1:X}", i, InData.Data[i]);
}

Lav evt. en label og sæt det ind i stedet for at skrive til en consol
Avatar billede madsens90 Praktikant
11. august 2010 - 20:18 #14
Hej Heinzdmx. :) Nederste array (dit sidste indlæg) har jeg prøvet. :) Det er det jeg benytter mig af lige nu nemlig.

Har også kigget på de eksempler der er, men det er alt alt for rodet til at jeg kan få noget som helst ud af det. :S

Jeg benytter mig også af timeout lige nu. Det giver det array som jeg bruger sammen med det som du viser i dit seneste indlæg. :)

Dit post 17:34 kigger jeg lige nærmere på når jeg lige kan sætte mig ned med det igen.

På forhånd... igen igen.. tak! :)
Avatar billede heinzdmx Nybegynder
16. august 2010 - 21:11 #15
Lige en lille update. I mellemtiden er det HID Lib vi bruger flyttet til en anden code hoster, og kan nu findes på:
http://github.com/mikeobrien/HidLibrary

Pt. er det kun til 32 bit, men manden bag lib'et lover at 64 bit snart vil blive understøttet.
Avatar billede madsens90 Praktikant
20. juni 2011 - 16:32 #16
Beklager den ekstremt lange ventetid, men gik død i projektet fordi jeg ikke kunne få det til at virke.

Jeg har senere hen tænkt tilbage på hvad der mon var galt, og tror simpelthen at det var den ir usb dongle jeg havde fat i, som ikke understøttede det jeg var interesseret i.

Så leder efter en infrarød usb dongle med en rækkevidde på et par meter. Kan kun finde nogle med en rækkevide på 1-2 meter, men er ikke nok.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester