Question Comment envoyer un message à un périphérique USB


Je dois pouvoir envoyer un petit nombre d'octets à un périphérique USB, mais je ne sais pas comment.
Je connais l'identifiant du fournisseur et du produit, ainsi que la chaîne de message (mais j'ai besoin d'aide pour savoir s'il s'agit d'une chaîne ASCII ou d'une chaîne hexadécimale).

Il y a un morceau de logiciel appelé usb_modeswitch cela semble faire cela, mais c'est seulement Linux.
J'ai vu un fil quelque part où les gens l'ont compilé avec mingw, mais n'ont pas fourni leurs binaires et je ne suis pas à l'aise de l'essayer moi-même.

Quelqu'un mentionné en utilisant WinUSB ce qui serait idéal compte tenu de son inclusion native, mais je ne connais pas l'interface.
Je possède / peut obtenir Visual Studio, mais j'aurais besoin d'aide pour savoir quoi utiliser choses que je vois en ligne.

Une bonne alternative semble être PyUSB avec libusb-win32 (un port de ce que usb_modeswitch utilise).
Qui pourrait être utilisé comme ça au lieu de cela avec l'écriture au lieu de lire, mais j'ai toujours besoin de savoir s'il faut envoyer juste une chaîne ou essayer de convertir en octets à partir d'une représentation hexadécimale avant d'appeler write().

Ceci est l'info:

DefaultVendor=046d
DefaultProduct=c261
MessageEndpoint=01
ResponseEndpoint=01
TargetClass=0x03
MessageContent="0f00010142"

Le contexte
Si ça aide

J'ai un Logitech G920 qui fonctionne, il refuse d'être reconnu comme périphérique sur ma machine.

Devices and Printers screenshot

Aucune quantité de désinstallation de pilotes, d'essayer d'autres slots USB, de brancher sans alimentation, de supprimer les travaux de LGS. Mais curieusement, cela fonctionne toujours sur mon ordinateur portable et sur la Xbox elle-même.

Je suis sur le point d'abandonner et de reformater ma machine quand je tombe sur ce fil: post screenshot

Assez sur:

device manager screenshot

C'est là que j'ai trouvé ce post. Certaines personnes intelligentes ont résolu ce problème émettre pour eux-mêmes sur Linux, en utilisant un logiciel conçu pour demander à ces modems USB de basculer entre leur mode pilote-installation-flash et leur mode Internet-modem.
Les informations ci-dessus venaient de là et je ne connais pas la signification du '%b/%k', J'espère que c'est une chose spécifique à usb_modeswitch qui n'est pas nécessaire.

Maintenant, j'ai juste besoin de le faire fonctionner dans Windows.
Merci pour toute aide.


3
2018-02-11 09:08


origine




Réponses:


OUI!

J'ai fini par aller avec pyusb, et parce que la roue est un appareil HID, vous devez écraser le pilote en utilisant Zadig (libusb-win32 était le seul qui fonctionnait). Après avoir obtenu les deux libusb-win32 et libusb1.0 bibliothèques de liens dynamiques pour python à utiliser (je ne sais pas qui, j'essayais beaucoup de choses) c'est le code qui a fonctionné:

import usb.core
import usb.util
import usb.backend.libusb1
import sys

VENDOR_ID = 0x046D
PRODUCT_ID = 0xC261

BACKEND = usb.backend.libusb1.get_backend(find_library=lambda x: "libusb-1.0.dll")


dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID, backend=BACKEND)

if dev is None:
    raise ValueError('Device not found')

dev.write(1, '0f00010142'.decode("hex"))

success


1
2018-02-11 15:06



le script doit être exécuté chaque fois que je le branche, ce qui n'est pas trop grave, mais s'il est possible de créer un nouveau pilote, il suffit d'envoyer le code magique qui serait idéal - Hashbrown