Hoppa till innehåll

Bestämma enhetens skrivtyp

När du har fastställt din enhets protokolltyp kan du behöva bestämma vilken specifik skrivfunktion du ska använda. HID-enheter har specifikt två olika skrivmetoder som riktar sig mot olika USB-överföringsmekanismer.


device.write() skickar data med hjälp av bulk- eller interrupt-transferering på enhetens aktuellt valda HID-slutpunkt. Det här är standardskrivvägen och fungerar för de flesta enheter.

Användningsfall för device.write():

  • Om enheten skickar och tar emot fasta längdrapporter via interrupt-transferering
  • Om din Wireshark-inspelningsfil visar URB_INTERRUPT-transfereringar
  • Om enheten inte använder ett HID-rapport-ID på den valda slutpunkten (kräver nollutfyllning — se nedan)
var packet = [];
packet[0] = 0xEC;
packet[1] = 0x40;
packet[2] = channel;
packet = packet.concat(RGBData);
device.write(packet, 65);

device.send_report() skickar data med hjälp av en HID SET_REPORT-kontrolltransfering. Det riktar sig mot HID-funktionsrapportmekanismen snarare än interrupt-slutpunkten.

Användningsfall för device.send_report():

  • Om din Wireshark-inspelningsfil visar URB_CONTROL-transfereringar med SET_REPORT-förfrågan (förfrågningskod 0x09)
  • Om device.write() returnerar felet “incorrect function” på alla slutpunkter
  • Om enheten explicit använder HID-funktionsrapporter för sitt kommandogränssnitt
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);

Den matchande läsfunktionen för funktionsrapporter är device.get_report(), som utför en GET_REPORT-kontrolltransfering. Använd den när du behöver läsa konfiguration via samma funktionsrapportmekanism.


Om du är osäker, börja med device.write(). Det fungerar för de flesta HID-enheter. Om du får felet “incorrect function”, byt till device.send_report(). Om båda misslyckas, verifiera att du har valt rätt slutpunkt.

SymptomProva
Fungerar som förväntatKlart
Felet “Incorrect function”Byt till device.send_report()
Felet “Access is denied”Fel slutpunkt — se Välja slutpunkter
Inga fel men enheten svarar inteFel slutpunkt eller fel enhetstyp

Vissa HID-enheter kräver att den första byten i varje paket är 0x00. Det här sker när enheten inte har ett rapport-ID tilldelat den valda slutpunkten — HID-drivrutinen strippar byte 0 innan den vidarebefordrar data till enheten, så du måste kompensera genom att flytta allt en position framåt.

Tecken på att du behöver nollutfyllning:

  • Om din Wireshark-inspelningsfil visar den första meningsfulla kommandobyten vid offset 1 snarare än offset 0
  • Om enheten ignorerar paketet eller producerar felaktiga utdata utan nollbyten

Hur man implementerar det:

// Utan nollutfyllning (paketstorlek 64)
packet[0] = 0xEC; // kommando
packet[1] = 0x40;
device.write(packet, 64);
// Med nollutfyllning (paketstorlek 65)
packet[0] = 0x00; // utfyllningsbyte — konsumeras av HID-drivrutinen
packet[1] = 0xEC; // kommando nu vid offset 1
packet[2] = 0x40;
device.write(packet, 65);

Tumregel: Om din Wireshark-inspelningsfil visar ett 64-byte-paket men device.write(packet, 64) inte fungerar, prova device.write(packet, 65) med packet[0] = 0x00 och alla andra bytes förskjutna ett steg uppåt.


Motsvarigheterna på läsarsidan följer samma distinktion:

SkrivmetodMatchande läsmetodTransfereringstyp
device.write()device.read()Bulk / Interrupt
device.send_report()device.get_report()Control (GET_REPORT)

Använd device.input_report() specifikt för att läsa inmatningsrapporter (inte funktionsrapporter). Se sidan Avancerad kommunikation för detaljer.