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
Section titled “device.write”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
Section titled “device.send_report”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.
Vilken ska du prova först
Section titled “Vilken ska du prova först”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.
| Symptom | Prova |
|---|---|
| Fungerar som förväntat | Klart |
| Felet “Incorrect function” | Byt till device.send_report() |
| Felet “Access is denied” | Fel slutpunkt — se Välja slutpunkter |
| Inga fel men enheten svarar inte | Fel slutpunkt eller fel enhetstyp |
Nollutfyllning
Section titled “Nollutfyllning”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; // kommandopacket[1] = 0x40;device.write(packet, 64);
// Med nollutfyllning (paketstorlek 65)packet[0] = 0x00; // utfyllningsbyte — konsumeras av HID-drivrutinenpacket[1] = 0xEC; // kommando nu vid offset 1packet[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.
Läsa data
Section titled “Läsa data”Motsvarigheterna på läsarsidan följer samma distinktion:
| Skrivmetod | Matchande läsmetod | Transfereringstyp |
|---|---|---|
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.