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
Section titled “device.write”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
Section titled “device.send_report”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.
Welke u als eerste moet proberen
Section titled “Welke u als eerste moet proberen”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.
| Symptoom | Probeer |
|---|---|
| Werkt zoals verwacht | U bent klaar |
| ”Onjuiste functie”-fout | Schakel over naar device.send_report() |
| ”Toegang geweigerd”-fout | Verkeerd eindpunt — zie Eindpunten selecteren |
| Geen fout, maar apparaat reageert niet | Verkeerd eindpunt, of verkeerd apparaattype |
Nul-opvulling
Section titled “Nul-opvulling”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; // commandpacket[1] = 0x40;device.write(packet, 64);
// With zero padding (packet size 65)packet[0] = 0x00; // padding byte — consumed by HID driverpacket[1] = 0xEC; // command now at offset 1packet[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.
Gegevens terugbrengen
Section titled “Gegevens terugbrengen”De lees-equivalenten volgen dezelfde splitsing:
| Schrijfmethode | Bijpassende leesmethode | Overdrachtstype |
|---|---|---|
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.