Ga naar inhoud

Apparaatschrijftype bepalen

Zodra u het protocoltype van uw apparaat kent, moet u mogelijk nog bepalen welke specifieke schrijffunctie u moet gebruiken. HID-apparaten in het bijzonder hebben twee verschillende schrijfmethoden die verschillende USB-overdrachtssmechanismen aansturen.


device.write() verzendt gegevens via een bulk- of interrupt-overdracht op het momenteel geselecteerde HID-eindpunt van het apparaat. Dit is het standaard schrijfpad en werkt voor de meerderheid van apparaten.

Gebruik device.write() wanneer:

  • Het apparaat rapporten van vaste lengte verzendt en ontvangt via interrupt-overdracht
  • De Wireshark-opname URB_INTERRUPT-overdrachten toont
  • Het apparaat geen HID-rapport-ID gebruikt op het geselecteerde eindpunt (wat nul-opvulling vereist — zie hieronder)
var packet = [];
packet[0] = 0xEC;
packet[1] = 0x40;
packet[2] = channel;
packet = packet.concat(RGBData);
device.write(packet, 65);

device.send_report() verzendt gegevens via een HID SET_REPORT-beheersoverdracht. Dit richt zich op het HID-functieraporteringsmechanisme in plaats van het interrupt-eindpunt.

Gebruik device.send_report() wanneer:

  • De Wireshark-opname URB_CONTROL-overdrachten toont met een SET_REPORT-aanvraag (aanvraagcode 0x09)
  • device.write() een “onjuiste functie”-fout retourneert op alle eindpunten
  • Het apparaat expliciet HID-functierapporten gebruikt voor zijn opdrachtinterface
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);

De bijbehorende leesfunctie voor functierapporten is device.get_report(), die een GET_REPORT-beheersoverdracht uitgeeft. Gebruik het wanneer u configuratie moet terugbrengen via hetzelfde functieraporteringsmechanisme.


Als u niet zeker weet, begin met device.write(). Het werkt voor de meerderheid van HID-apparaten. Als u een “onjuiste functie”-fout krijgt, schakel dan over naar device.send_report(). Als beide mislukken, verifieer dat u het juiste eindpunt heeft geselecteerd.

SymptoomProbeer
Werkt zoals verwachtU bent klaar
”Onjuiste functie”-foutSchakel over naar device.send_report()
”Toegang geweigerd”-foutVerkeerd eindpunt — zie Eindpunten selecteren
Geen fout, maar apparaat reageert nietVerkeerd eindpunt, of verkeerd apparaattype

Sommige HID-apparaten vereisen dat de eerste byte van elk pakket 0x00 is. Dit treedt op wanneer het apparaat geen rapport-ID heeft toegewezen aan het geselecteerde eindpunt — het HID-stuurprogramma verwijdert byte 0 voordat de gegevens worden doorgegeven aan het apparaat, dus u moet alles één positie verschuiven om dit te compenseren.

Tekenen dat u nul-opvulling nodig heeft:

  • De Wireshark-opname toont de eerste betekenisvolle opdrachtbyte op offset 1, niet offset 0
  • Zonder de nulbyte negeert het apparaat het pakket of produceert het onzinnige uitvoer

Hoe u het toepast:

// Without zero padding (packet size 64)
packet[0] = 0xEC; // command
packet[1] = 0x40;
device.write(packet, 64);
// With zero padding (packet size 65)
packet[0] = 0x00; // padding byte — consumed by HID driver
packet[1] = 0xEC; // command now at offset 1
packet[2] = 0x40;
device.write(packet, 65);

De vuistregel: als uw Wireshark-opname een 64-byte pakket toont maar device.write(packet, 64) niet werkt, probeer dan device.write(packet, 65) met packet[0] = 0x00 en alle andere bytes één positie omhoog verschoven.


De lees-equivalenten volgen dezelfde splitsing:

SchrijfmethodeBijpassende leesmethodeOverdrachtstype
device.write()device.read()Bulk / Interrupt
device.send_report()device.get_report()Beheer (GET_REPORT)

Voor het specifiek lezen van invoerrrapporten (geen functierapporten), gebruik device.input_report(). Zie Geavanceerde communicatie voor details.