usb en dotnet


dit topic is om te laten zien hoe je begint met usb in VB 2008 of VC# 2008 en is puur informatief bedoeld.

voorgeschiedenis:
ik en mijn broer(ook hier op het forum zwervend) ben ik bezig met een usb apparaat

usb is nu niet iets waarvan je denk dat doe ik even dit topic is ook meer informatief bedoeld en het project is nog in ontwikkeling echter wil ik de informatie met jullie delen vandaar dit topic.

overzicht van wat we gebruiken:

hardware:
Device: 18F2550
clock: voor als nog 4Mhz xtal
Compiler: MikroC
Protocol: HID
Doel: led spots aandrijven bestuurbaar via usb
Waarom: vanwege mijn broer zijn eindstuk(ondernemingsplan)

de compiler heeft een hid terminal die het usb deel afvangt voor ons.

software:
Talen: Visual Basic 2008, Visual C# 2008, C
ide: Visual Studio en Codeblocks
usb layer:LibUsbDotNet voor C#, LibUsb0

/einde voor geschiedenis.

hoe gaan we te werk:
download op http://sourceforge.net/projects/libusbdotnet/ de installeble package en installeer deze.

er zit een duidelijke handleiding bij voor het gebruik van de liberary's maar niet hoe je ze implementeer in VC# of VB daarom schrijf ik dit:

werkwijze VB:
Creeër een nieuw project zoals je dat normaal doet.
ga nu naar je solution explorer en dan rechtermuisknop op je project en kies voor properties.( je kan ook project--> add reference-->browse gebruiken maar dan zie je niet of hij wordt opgenomen in de lijst)

kies links in de tabbladen voor references en druk op de "add" knop en dan tabblad browse.
zoek LibUsbDotNet.dll op deze bevind zich in de map: root/program files/LibUsbDotNet selecteer de dll en druk op "ok"

er is nu een assembly toegevoegd aan de lijst

je kan nu de namespace aanroepen zoals je dat met elk ander zou doen in je programma.

werkwijze VC#
Creeër een nieuw project zoals je dat normaal doet.
ga naar je solution explorer rechtermuisknop op "references" dan kiezen voor "add reference" tabblad "browse" zoeken naar "LibUsbDotNet.dll" de staat in Root\program files\LibUsbDotNet.dll\ klikken op "ok" en de assembly wordt opgenomen in je referentie's

in je code moet je nog wel even het volgende toevoegen:
code:
using LibUsbDotNet.DeviceNotify;
using LibUsbDotNet.Usb;
using LibUsbDotNet.Usb.Main;


hopelijk maakt dit het een stukje toegankelijker om met usb te gaan beginnen.

mits mijn broer hiermee instemt komt de pc source vrij(echter is het zijn programma dus hij beslist)

zodra er meer dingen zijn die jullie moeten weten schrijf ik ze bij.

disclaimer
dit topic is geopend na overleg met een admin omdat het op het randje van CO ligt.
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
een stap verder in onze weg naar usb communicatie
Als je Libusb instaleert krijg je er een INF Creation wizard bij deze wijst zijn eigen uit en eenmaal de inf gecreëerd zal je usb apparaat ook worden herkend als je hem inplugd.

/meer info kan worden verwacht naar mate het project zich vordert.
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
Ik zal in elk geval de vorderingen volgen, in C++ (niet VC++) heb ik al de basiscomunicatie aan de praat gekregen ooit. Als je echter snel een grafisch programma nodig hebt is VB een zeer leuk speeltje.

Ik denk dat als je een echte tutorial er van maakt deze wel bij artikelen geplaatst kan worden. Maar daarover beslissen de rode namen nog altijd

(Na de examens ga ik het eens proberen!)
VHDL... jazeker, das pure hardware. Maar ach, de softwareprogammeurs zullen dat nooit snappen!
C++ of VC++ is redelijk uitwisselbaar gelukkig

als ik wat verder ben zal ik eens kijken of ik er iets over kan schrijven als tutorial
het blijft blijft dat je dan een algemeen vid en pid nodig hebt.
de compiler die ik gebruik leent zich echter neit voor de pic kant omdat deze niet gratis is.
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
het eerste kleine progje is af en is puur om te laten zien hoe je een en ander opvraagt
het is een CLI
code:
Imports libusbdotnet.usb

Module usb_co
    Dim list As LibUsbDotNet.Usb.Main.UsbDeviceList
    Sub Main()
begin:
        list = LibUsbDotNet.Usb.UsbGlobals.DeviceList

        Console.Clear()

        For i As Integer = 1 To list.Count
            Console.WriteLine(list.Item(i - 1).Info.ManufacturerString)
            Console.WriteLine(list.Item(i - 1).Info.ProductString)
            Console.WriteLine()
        Next

        Console.WriteLine("enter ""refresh"" to start over again")
        If Console.ReadLine = "refresh" Then
            GoTo begin
        End If

    End Sub

End Module
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
een kleine aanpassing in de source en dan ook gelijk maar even een screenie posten:

code:
Imports libusbdotnet.usb

Module usb_co
    Dim list As LibUsbDotNet.Usb.Main.UsbDeviceList
    Sub Main()
begin:
        list = LibUsbDotNet.Usb.UsbGlobals.DeviceList

        Console.Clear()

        For i As Integer = 1 To list.Count
            Console.WriteLine(list.Item(i - 1).Info.ManufacturerString)
            Console.WriteLine(list.Item(i - 1).Info.ProductString)
            Console.WriteLine()
        Next

        Console.WriteLine("enter ""refresh"" to start over again")
        If Console.ReadLine = "refresh" Then
            GoTo begin
        End If

    End Sub

End Module

http://i652.photobucket.com/albums/uu245/timmie_co/cli2.gif
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
Beste,

Ik vroeg me af of de betrouwbaarheid van libraries zoals "LibUsbDotNet" "sharpLibUSB" enz niet betwistbaar is ? Ik vind hier eerlijk gezegd te weinig documentatie over. En op vele forums vind je dat er fouten e.d. inzitten.

Ik geloof wel in de betrouwbaarheid van libusb opzich. Maar kun je hiervoor dan in VC++ een GUI voor schrijven? Want ik vindt enkel voorbeeldjes van console software.

Mvg.
Jan Cools
ik ben ook geen fan van libusb. der zitten konijnen in. en het is niet proper om op die manier usb te gan doen. gebruik een driver die gemaakt si voor jouw system en klaar.
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... 7,714,746 / 7,355,303 / 7,098,557 / 6,762,632
Je zegt, gebruik een driver die gemaakt is voor jouw systeem. Bijvoorbeeld: ik heb windows XP, en ik wil zelf een GUI schrijven voor het besturen van een relaiskaart over USB. Die driver moet je dan toch zelf gaan schrijven en dusdanig kan je toch niet buiten libraries ?
Op 7 maart 2009 18:14:37 schreef The Dutchman:
Ik geloof wel in de betrouwbaarheid van libusb opzich. Maar kun je hiervoor dan in VC++ een GUI voor schrijven? Want ik vindt enkel voorbeeldjes van console software.


Tuurlijk kan je een GUI maken, alleen ga je hiervoor denk ik lang mogen zoeken achter voorbeelden, het is 100x meer werk om een simpele GUI te maken dan het gewoon mbv console uit te leggen.

Libusb ism bijvoorbeeld WXwidgets is zeer handig als je zowel voor windows en linux wil kunnen compilen...

@FE:
Waar zitten die konijnen dan juist? Ik ben ze nog niet tegengekomen.
VHDL... jazeker, das pure hardware. Maar ach, de softwareprogammeurs zullen dat nooit snappen!
shizzle dizzle

Golden Member

Hier staat ook veel informatie op. http://www.lvr.com/hidpage.htm
Deze software maakt gebruik van de hid library (of hoe je dat ook maar noemt) van windows zelf.
ING. -> werktuigbouw nu het echte werk, elektronica
Op 7 maart 2009 20:18:23 schreef fast4ever:
[...]

Tuurlijk kan je een GUI maken, alleen ga je hiervoor denk ik lang mogen zoeken achter voorbeelden, het is 100x meer werk om een simpele GUI te maken dan het gewoon mbv console uit te leggen.

Libusb ism bijvoorbeeld WXwidgets is zeer handig als je zowel voor windows en linux wil kunnen compilen...

@FE:
Waar zitten die konijnen dan juist? Ik ben ze nog niet tegengekomen.


er zijn problemen met devices die vid/pid dynamisch veranderen bijvoorbeeld ( Cypress 68073 of Fx2 gebaseerde devices. ) Libusb kan daar geen of slecht weg mee.
Ook mulitpart devices geven problemen ( devices die zichzelf meerdere subdevices toekennen )
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... 7,714,746 / 7,355,303 / 7,098,557 / 6,762,632
hier werkt libusb0 goed tot het moment dat ik dus wil gaan connecten(hid device)(niet alleen bij mij trouwens).
gui tekenen kan altijd.

@Free voor een hid ga ik echt geen divece specifike driver schrijven.
op de msdn, codeguru,developerforum's is bijzonder weinig te vinden over usb

@SD die had ik ook gevonden.
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
Voor HID hoef je helemaal geen driver te schrijven ! windows heeft calls aan boord daarvoor. Axelson heeft voorbeelden hoe je er mee omspringt. geen externe libraries nodig.

[Bericht gewijzigd door Henry S. op 8 maart 2009 13:27:55 (55%)]

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... 7,714,746 / 7,355,303 / 7,098,557 / 6,762,632
Complete - Everything You Need to Develop Custom USB Peripherals, Second Edition; Jan Axelson; (Lakeview Research, 2001)
die axelson?

ja maar die calls kan ik niet vinden Free_e
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... 7,714,746 / 7,355,303 / 7,098,557 / 6,762,632
Op 7 maart 2009 20:39:20 schreef free_electron:
er zijn problemen met devices die vid/pid dynamisch veranderen bijvoorbeeld ( Cypress 68073 of Fx2 gebaseerde devices. ) Libusb kan daar geen of slecht weg mee.
Ook mulitpart devices geven problemen ( devices die zichzelf meerdere subdevices toekennen )


oef, daar werk ik toch niet mee wel zeer fijn om te weten!
VHDL... jazeker, das pure hardware. Maar ach, de softwareprogammeurs zullen dat nooit snappen!
Beste.. Na wat discussiëren zijn timmie en ik (vooral timmi ) overgegaan tot programeren..

Nu kan ik voorlopig echter niet meer verder. Ik kan mijn fouten niet vinden. Ik heb een topic gepost op een VB-forum. Nu weet ik niet of het "mag" om er hier naar te verwijzen? Ik maak geen reclame toch ?(sorry modjes )

USB heeft te maken met elektronica, maar de code schrijven heeft meer te maken met VB.

Hier alvast de link:
http://vbib.be/PNphpBB2-viewtopic-t-5814.phtml


Mvg.
Jan Cools
madwizard

Golden Member

Ik ken die library niet en VB heb ik in geen jaren gebruikt maar het lijkt nu net of je de eerste byte meegeeft aan hidWriteEx in plaats van een referentie naar de buffer. Maar kan zijn dat dat VB syntax is die ik niet ken.

Ook is met de windows API de eerste byte van de buffer het report ID, misschien dat jouw lib dat anders doet maar lijkt me vreemd dat die altijd 0 moet zijn (of je report ID is 0).

Verder moet de grootte van je data overeen komen met de report size. En je hebt nog onderscheid tussen feature reports (via control endpoint) en output reports (via apart out endpoint).
Waarom verlies ik toch het vertrouwen in al die Lib's?
Ofwel zit de fout echt in de lib ofwel zie ik geweldig veel over het hoofd.. Dit is pakweg de 5de library al..

Wat gebruiken jullie om USB host software mogelijk te maken?
Kent iemand misschien goede alternatieven voor USB in VB.NET?
@madwizard:mijn outputbuffer is evengroot als mijn reportsize

vb kent geen pointers(alleen een By Reference declaratie,die ook niet helpt of ik moet alles gaan omschrijven, wat eigenlijk niet geprobeerd heb)

/e: wat dus gene zak helpt
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
madwizard

Golden Member

Probeer eens SimpleHIDWrite van deze site: http://www.lvr.com/hidpage.htm . Daarmee kun je kijken of het device sowieso werkt als je een HID commando stuurt.
het device werkt dat weet ik honderd procent zeker(het probleem zat hem erin dat de handle's niet werden vernietigd van libusb en dat dan de computer niet afsloot)
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide,site van mijn meisje
Nu de LibUsb volledig van de hand is gedaan en we al heel wat vorderingen hebben gemaakt op vlak van HID-devices (zoals in Show your projects topic te zien was) is er een probleem opgedoken.

De applicatie leest de juiste data binnen, en van de write functie krijg ik deze keer een True terug. (ik kan aannemen dat dit verder werkt).

Het probleem situeert zich bij het uittrekken van de USB-Kabel.
Ik heb enkele tests gedaan, en het is niet makkelijk te omschrijven wat het juist doet. Dus ik excuseer mij al van tevoren voor onduidelijk uitleg.

1. Ik plug mijn PIC18F2550 in op een USB-Poort.
2. Rechtsonder een ballon (USB-Device -> USB-Hid -> Geïnstalleerd en klaar voor gebruik)
3. Ik plaats mijn VB.NET project in RUN modus.
4. In de debug box die ik geplaatst heb zegt hij dat hij verbonden is en geeft de data weer die de PIC heeft verzonden.
5. Ik druk op het rode kruisje in het form zodat de applicatie afsluit.
6. Ik plaats de applicatie terug in RUN modus.
7. Ik zie in de debug box weer de verbinding en juiste data verschijnen.
8. Terwijl de applicatie draait trek ik mijn USB-Kabel uit. (Ik krijg een OnUnPlugged event)
9. Ik steek de USB-Kabel terug in
10. Ik zie dat hij verbonden is (hij leest vendorname en productname nog correct uit)
11. Er komt geen data meer binnen en de write functie geeft een false terug.
12. Ik ga naar Configuratiescherm -> Apparaatbeheer ->
Ik verwijder de drivers van mijn apparaat
en alles begint weer bij stap 3.

Nu een andere situatie, daarnet hebben we gezien dat we de applicatie op een goede manier konden sluiten en weer starten zodat het nog werkte (USB kabel bleef hier bij inzitten)

1. Plaats applicatie in RUN-Modus.
2. HID device verbonden en data wordt binnengelezen.
3. Sluit applicatie. (als we hieropvolgend de applicatie terug zouden starten zou ze nog steeds werken, maar dit gaan we niet doen)
4. Ik verwijder de USB-kabel .. (geluidje van windows: "POPOPOM") ..... Ik steek de USB-kabel terug in .. (geluidje van windows: ("POMPIDOEM")..
5. Ik start de applicatie
6. Ik lees de vendorname en productname af, maar ontvang weer geen data.

Conclusie:
Alles werkt tot ik mijn kabel ga uittrekken en terug inpluggen. Dan kan ik enkel nog mijn problemen oplossen door de drivers te verwijderen en opnieuw te installeren.

Iemand ideetjes?
2 zaken:

bij een onunplugged event moet je de eventhandelers die data ontvangen en zenden ontkoppelen. daar moet ene functie call voor zijn ( desnoods een .dispose oproepen. Draait dat in een andere thread ? zoja : stop die thread )

die dingen draaien op 2 lagen. de plug / unplug is 1 layer. die is altijd toegankelijk. de andere koppelen in op een 'return call'. dat wordt niet automatisch verbroken.
met andere woorden die dingen praten nog altijd tegen iets wat niet meer bestaat.

in 2e geval blijft de driver steken volgens mij.
je verlaat programma zonder op te kuisen. bij het unpluggen gaat de driver dan in deadlock. dat kan ene bug in de driver zijn.

in dat helmhi dding zit een functie form_onclosing : die kuist de connectie op. doe je dat ?

nog iets heel belangrijk : ga in je pic code NOOIT breakpoints plaatsen. USB heeft timeouts in de orde van milliseconden. je mag alleen breakpoints plaatsen eenmaal de USB transactie compleet is. ook melding terug via het debug kanaal moeten gebeuren na de USB transactie. Ik ben daar regelmatig op vastgelopen gewoon omdat de bus ene timeout genereert.

[Bericht gewijzigd door free_electron op 14 maart 2009 20:28:12 (19%)]

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... 7,714,746 / 7,355,303 / 7,098,557 / 6,762,632