Forum: PC-Programmierung C# Windows-Treiber für mein Arduino OneButton-GamePad


von Falke88 (Gast)


Lesenswert?

Guten Tag Zusammen,


Mein Problem:

Ich habe einen One-Button Device mit Arduino gebastelt. Diesen kann ich 
mit einem USB Kabel zum COM3 meines Rechners verbinden. Die Verbindung 
funktioniert einwandfrei und ich bekomme je nach Taster-State den 
gewünschten Wert in meinem Programm. Um diese Button Events in meinem C# 
Programm zu erkennen habe ich eine API geschrieben die als Treiber 
dienen soll.

Hier diese API in C# Code:
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Threading.Tasks;
6
using System.Threading;
7
using System.IO.Ports;
8
9
namespace ButtonBoyDriver
10
{
11
  public static class ButtonBoy
12
  {
13
    public static event ButtonPressHandler ButtonEvent;
14
    public delegate void ButtonPressHandler(Boolean isPressed);
15
    private static SerialPort _serialPort;
16
17
    static ButtonBoy()
18
    {
19
      _serialPort = new SerialPort("COM3", 9600);
20
      _serialPort.Open();
21
      Thread thread = new Thread(new ThreadStart(CheckButton));
22
      thread.Start();
23
    }
24
25
    private static void CheckButton()
26
    {
27
      int pressed = 0;
28
29
      while (_serialPort.IsOpen)
30
      {
31
        pressed = _serialPort.ReadByte();
32
        if (pressed == 1)
33
        {
34
          ButtonEvent(true);
35
        }
36
        else
37
          ButtonEvent(false);
38
      }
39
    }
40
  }
41
}


Ich erreiche eigentlich schon viel mit diesem "Treiber". Ich muss halt 
nur in jedem Programm in dem ich meinen Device nutzen will diese 
ButtonBoyDriver.dll einbinden.
Jedoch bin ich nicht ganz zufrieden. Denn soweit ich mich entsinne 
bindet man bei z.b. einer Spieleprogrammierung ja nicht etliche Treiber 
Assemblies der möglichen Anbieter ein. Nein die sammeln sich alle 
irgendwie in einer generischen Treiber Assembly oder sowas.

Und hier beginnt meine Fragerei. Ich finde leider noch nicht den Weg 
meinen Treiber über das ganze System zur Verfügung zu stellen. Auf 
Kernel oder OS Ebene oder wo auch immer der hin muss.

Google bewirft mich mit Windows Developer Kit und Windows Driver 
Frameworks und so weiter. Leider bekomme ich nicht die konkrete 
Information wie ich denn jetzt mit diesen oben genannten Kits und 
Frameworks einfach mal einen Treiber für meine COM3 Schnittstelle (als 
Beispiel) schreibe.

Auch Videos erzählen irgendwie nur was das ist und was das macht.

Ich finde auch keine Framework Documentation wo ich konkret Klassen sehe 
die ich nutzen kann und welche Library ich dafür einbinden muss.


Darum die Frage an Euch. Wie kann ich einen ganz simplen Treiber 
schreiben der für das OS (Oder wo auch immer ein Hardware Treiber landen 
muss) bereitsteht.


mfg Charlie


Danke für jegliche Hilfe im Voraus !

von keiner (Gast)


Lesenswert?

Das einfachste ist eine fertige Library zu nehmen,
sodass der Arduino als Human-Interface-Device (HID) anmeldet wird.
Es gibt auch fertig programmierte AVRs, die sich direkt als Joystick 
anmelden, teilweise mit irrsinnig vielen Analogkanälen usw. Das ist dann 
aber keine reguläre (simulierte) RS232 mehr sonderen ein eigener 
Standard, der für Tastaturen, Mäuse und auch Gamepads gedacht ist.
Suchbegriffe: "Arduino HID device", "AVR HID device", "AVR Joystick", 
"keywarrior"

von bluppdidupp (Gast)


Lesenswert?

Alternativ könntest du auch ein Tool schreiben, dass sich per COM mit 
deinem Device verbindet und via 
https://msdn.microsoft.com/de-de/library/system.windows.forms.sendkeys(v=vs.110).aspx 
Tastatureingaben an die aktive Anwendung senden (also praktisch Tastatur 
spielen)

von Falke88 (Gast)


Lesenswert?

Okay verstehe. Bei beiden eurer Vorschläge simuliere ich ja eigentlich 
eine schon vorhandene Library/Ein Pattern für ein Device.

Aber auch diese müssen ja irgendwie programmiert werden und haben von 
Windoof ja divere Frameworks oder APIs zum ansprechen der OS-Architektur 
erhalten. Genau diesen Kram würde ich gerne haben um meinen Treiber 
selber so relativ selbstständig mit den System zu kommunizieren.

Dafür irgendwelche Vorschläge?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Falke88 schrieb:
> Genau diesen Kram würde ich gerne haben um meinen Treiber selber so
> relativ selbstständig mit den System zu kommunizieren.
>
> Dafür irgendwelche Vorschläge?

Die hast Du Dir schon selbst gegeben -- ja, das WDK. Nein, das ist 
nichts, was mit dem .Net-Geraffel programmiert werden könnte.

Das ist auch eindeutig der falsche Weg. Windows-Treiberentwicklung ist 
haarig. Davon lässt man die Finger, wenn es nicht wirklich unbedingt 
nötig ist. Und das ist es in Deinem Fall absolut nicht.

Dein Gerät sollte bereits auf der USB-Schnittstelle das Verhalten einer 
zum Anwendungszweck passenden Standardgeräteklasse aufweisen. Das ist in 
Deinem Fall ein Eingabegerät, keine serielle Schnittstelle.

Für Eingabegeräte gibt es die HID-Geräteklasse. Dein 
Arduino-One-Button-Device muss sich als USB-HID ausgeben.

Erst wenn das erreicht ist, kann wiederum Dein Anwenderprogramm (oder 
ein beliebiges anderes) über die dafür vorgesehenen Mechanismen des 
Betriebssystems die vom Gerät ausgelösten Ereignisse mitbekommen.

Mit Winusb gibt es eine Betriebssystem-API, mit der über den Grundstock 
hinausgehende Interaktion mit USB-Devices möglich ist, aber auch das ist 
bei einem simplen HID schon ziemlicher Overkill.

https://msdn.microsoft.com/en-us/library/windows/hardware/ff540196(v=vs.85).aspx

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.