Seite 1 von 3

Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 03.12.2009 14:15
von Martin66119
Einen schönen guten Tag!

Da ich nicht recht versiert im programmieren bin, hoffe ich dass ich hier Hilfe finde.

Kann mir jemand mal ein Beispiel geben, wie man Daten von einem USB-Port einlesen kann. Z.B. An einer USB-Schnittstelle ist eine Maus angeschlossen und nun möchte ich wissen wie man die Impulse zählen kann, wenn man die Maus bewegt.

Danke für eure Hilfe.

Martin

Topic korrigiert, siehe unten - Kaeru fecit

Re: USB-Schnittstelle

Verfasst: 03.12.2009 16:56
von DarkDragon
Das ist leider nicht so einfach. Was verstehst du denn unter Impulse?! Zwischen dem Prozessor und dem USB Port steht meistens ein UART o.ä. und die Originalimpulse gehen verloren auf dem Weg zum Prozessor. Das einzige was du machen kannst sind die HID Deskriptoren auslesen, aber selbst das ist mehr als aufwändig und mit PureBasic kaum möglich, da man dazu einen USB Treiber zwischenrein stellen müsste.

Re: USB-Schnittstelle

Verfasst: 05.12.2009 13:45
von WPö
Habe kein Beispiel zur Hand und wie man direkt von USB liest, weiß ich auch nicht. Derzeit kann ich Dir nur ein paar Infos drumherum geben.

Vielleicht hilft Dir, daß seit den Zeiten der Seriell-Mäuse keine Impulse mehr übertragen werden, sondern Datenpakete, die die Anzahl der vertikalen und horizontalen Impulse enthalten. Das wird durch das BIOS 75-120 mal pro Sekunde abgefragt. Ein Datenprotokoll, das in P/S-2 verwendet wird und evtl. auch noch in USB, ist hier zu finden: http://www.computer-engineering.org/ps2mouse/.

Wenn es sich um eine andere Übertragung handeln sollte, etwa irgendwelche Werte per Seriell-zu-USB-Umsetzer, wird PC-intern die Verbindung mit einer emulierten Seriell-Verbindung hergestellt. Somit kannste einen Datentransfer mit dem Mikrokontroller machen, wie ich bei einem Mini-Digital-Oszilloskop mit µC.

Sag bitte Bescheid, ob das etwas weiterhalf.

Grüße - WPo

Re: USB-Schnittstelle

Verfasst: 08.12.2009 12:16
von Martin66119
Hallo und einen schönen guten Tag!

Bin leider heute erst dazugekommen im Forum nachzuschauen. Folgendes wollte ich machen.

Im "Hardware-Forum" ist ein Thema eingestellt bei dem es um die Messung einer Wegstrecke mit der Mouse geht.

Nundachte ich, dass es in PB eine Funktion oder auch einen "recht einfachen Code" gibt, mit dem man die Bewegung der Mouse (z.B. wie viel cm wurde die Mouse über das Mousepad" bewegt) ermitteln kann.

Grüße
Martin

Re: USB-Schnittstelle

Verfasst: 08.12.2009 19:09
von Kaeru Gaman
der billigste "recht einfache Code" wäre, wenn du einen Fullscreen aufmachst und präzise getimert das MouseDeltaX() ermittelst.

ohne Screen kannst du auch die Delta ermitteln, aber da dann wohl nur über API, weil die Koordinate sich ja nicht mehr ändert wenn die Maus anstößt.
also, dein normaler Maustreiber liefert IMMER ein vernünftiges Delta, das bekommst du bloß aus der Desktopkoordinate nicht raus,
weil der sozusagen automatisch X = X - DeltaX : IF X < 0 : X = 0 macht.


du siehst, da auf USB zugreifen zu wollen bist du komplett aufm falschen Dampfer, hättest gleich nach Mausbewegung fragen können.

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 09.12.2009 09:52
von Martin66119
Einen schönen guten Morgen!

An die Funktion MouseX hatte ich gedacht. Damit kann man aber doch nur die Mousebewegung ermitteln solange die Mouse auf dem Bildschirm ist. Wenn ich aber z.B. ein Stück Papier unbekannter Länge (z.B. 150cm) unter der Mouse hindurchziehe möchte ich aber gerne die Länge der Papiers ermitteln. Das Ergebnis sollte also 150cm sein.


Gruß
Martin

Re: USB-Schnittstelle

Verfasst: 09.12.2009 10:16
von Kaeru Gaman
Kaeru Gaman hat geschrieben:der billigste "recht einfache Code" wäre, wenn du einen Fullscreen aufmachst und präzise getimert das MouseDeltaX() ermittelst.

ohne Screen kannst du auch die Delta ermitteln, aber da dann wohl nur über API, weil die Koordinate sich ja nicht mehr ändert wenn die Maus anstößt.
also, dein normaler Maustreiber liefert IMMER ein vernünftiges Delta, das bekommst du bloß aus der Desktopkoordinate nicht raus
bitte lesen.

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 11:54
von Sebastian
Ich glaube, dass das nicht das Problem lösen wird. Wenn ich es richtig verstehe, willst Du deine Maus als "Maßband" missbrauchen?!!? Du willst Deine Maus über ein Holzbrett ziehen können und die Software soll Dir die Länge des Brettes ausgeben? Eine lustige Idee. Wenn ich es richtig sehe, dann wirst Du hier mit MouseDeltaX() aber nicht weiterkommen, da hier ja nur die Pixel ausgegeben werden. Das ist aber eine relative Größe, denn wie groß ist ein Pixel? Das hängt schließlich von der Lochmaske des Bildschirms und der verwendeten Auflösung ab. Ich habe auch noch nie mit MouseDeltaX() gearbeitet. Ich wollte das mal testen, nun läuft der Mist aber nicht. Was hab ich denn falsch gemacht?

Code: Alles auswählen

; INITIALISIERUNG

InitSprite()
InitMouse()

; HAUPTPROGRAMM

OpenScreen(1024,768,32,"Test")
StartTime=ElapsedMilliseconds()+1000
Debug ExamineMouse()

Repeat
NowTime = ElapsedMilliseconds()
If NowTime >= StartTime
 ClearScreen(0)
 pixel=MouseDeltaX()
 StartTime = ElapsedMilliseconds()+1000
 z=z+1
 StartDrawing(ScreenOutput())
 BackColor(0)
 FrontColor($ffffff)
 DrawText(0,0,"Maus wurde in der letzen Sekunde um " + Str(pixel) + " Pixel bewegt.")
 DrawText(0,30,"MouseX= " + Str(MouseX()))
 DrawText(0,50,"MouseY= " + Str(MouseY()))
StopDrawing()
FlipBuffers()
Debug ExamineMouse()
EndIf

Until z=10
ExamineMouse() gibt nur beim ersten Aufruf 1 aus, sonst 0...

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 12:48
von Kaeru Gaman
warum debuggst du den Rückgabewert von ExamineMouse?
außerdem muss das bei jedem Schleifendurchlauf aufgerufen werden, das aktualisiert die werte.
wieso debuggst du überhaupt was während eines Fullscreens?
... war das das erste mal dass du überhaupt was mit der Screen Mouse machst?

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 13:15
von Sebastian
Ich musste feststellen, dass ich MouseDeltaX() nicht auslesen konnte (immer 0). Ich habe zuerst mit einem Fenster und einer Console, die die Daten ausgeben sollte, gearbeitet. Dann dachte ich, dass es wohl nur mit dem aktiven Screen geht, deshalb der OpenScreen(). Ich habe ExamineMouse() debugged, um zu sehen, ob 0 oder 1. Und schließlich ist das doch auch der Fehler. Wieso muss ich ExamineMouse() bei jedem Schleifendurchlauf aufrufen? Außerdem möchte ich doch die "Pixelstrecke" auslesen, die innerhalb von einer Sekunde verschoben wurde...
Wovon ist denn ExamineMouse() abhängig? Tatsächlich: Wenn ist den Befehl in die Schleife schreibe, dann funktioniert es, aber warum nur dann?