Ga naar inhoud

Schrijven en lezen

Deze functies zijn alle beschikbare manieren om te communiceren met de aangesloten USB-apparaten in uw plugins. De opdrachten zijn opgesplitst in twee varianten van lezen en schrijven, afhankelijk van de protocollen van het apparaat, en stuuroverdrachten die handshake-opdrachten en geavanceerde functionaliteit mogelijk maken.

Voor geavanceerde methoden (bulk_transfer, control_transfer, input_report) en netwerk-/seriële communicatie, zie Geavanceerde communicatie.

Deze functie voert een Hid_Write-opdracht uit op het momenteel geselecteerde eindpunt van het apparaat. Dit is de schrijffunctie die de meeste apparaten gebruiken en de meest gebruikte opdracht.

  • Opmerking: Een andere variant van schrijven is device.send_report. Dit is de schrijfopdracht die wordt gebruikt om HID-functierapporten naar het apparaat te sturen. De functionaliteit is verder gelijk aan device.write().
  • Opmerking: Als u een lengte opgeeft die langer is dan de opgegeven data-array, wordt het einde van de array aangevuld met 0x00.
  • Opmerking: De meeste HID-apparaten vullen de voorkant van hun schrijfopdrachten met nullen. Dit wordt gedaan door een extra 0x00 aan het begin van uw DataArray te plaatsen en de lengte met één te verhogen. Deze waarden worden door het apparaat verwijderd tijdens de gegevensoverdracht. Dit komt voornamelijk voor wanneer het apparaat geen rapport-ID heeft voor het geselecteerde eindpunt.
ParameterTypeBeschrijvingVoorbeeld
DataArray1D-arrayEen array met hexadecimale bytes om naar het apparaat te sturen[0x08,0xAB,0xFF,0x37]
LengthIntEen Int-waarde die de totale te verzenden pakketlengte vertegenwoordigt4

Hieronder is een voorbeeld van een pakket van de ASUS LED-controllers dat de aanmaak en levering aan het apparaat toont.

var packet = [];
packet[0] = 0xEC; //This is the Report Id
packet[1] = 0x40; //Command
packet[2] = apply ? 0x80 | channel : channel; //Channel Number
packet[3] = start; //Led to Start on
packet[4] = count; //Led Count
packet = packet.concat(RGBData); //Array of RGB values in a [R,G,B ...] format
device.write(packet, 65); //Writing the packet to the device in 65 Bytes

Deze functieaanroep neemt een array met een eindpunt-rapport-ID en de te lezen bytelengte, en voert een Hid_Read uit op het apparaat. De functie retourneert een array van bytes die van het apparaat zijn gelezen. Sommige apparaten vereisen een leesbewerking om bufferoverloop te voorkomen en moeten soms configuratie- of instellingsdata van apparaten uitlezen.

  • Opmerking: Een andere variant van lezen is device.get_report. Dit is de leesopdracht die wordt gebruikt om HID-functierapporten van het apparaat op te halen. De functionaliteit is verder gelijk aan device.read().
ParameterTypeBeschrijvingVoorbeeldStandaard
DataArray1D-arrayEen array met het rapport-ID dat nodig is voor de leesopdracht[0x08, 0x02]
LengthIntEen Int-waarde die het aantal te lezen bytes vertegenwoordigt65
TimeoutIntMilliseconden om op data te wachten voordat wordt teruggekeerd. Geef 0 door voor een niet-blokkerende controle.100100
RetourTypeBeschrijvingVoorbeeld
DataArray1D-arrayEen array met alle gelezen HEX-bytes van het apparaat, of een lege array als de time-out verstreek zonder data[0x08, 0x02,0x00,0x64]
  • Opmerking: Deze functie retourneert een data-array die overeenkomt met de rapportlengte van het apparaat. Als u het werkelijke gelezen byteaantal nodig heeft, gebruik dan device.getLastReadSize().
  • Opmerking: Wanneer de time-out verstrijkt zonder data, is de retourwaarde een lege array en retourneert device.getLastReadSize() de waarde 0.
// Standard blocking read (100ms default timeout)
var config = device.read(packet, 65);
// Non-blocking peek — returns immediately, use getLastReadSize() to check if data arrived
var data = device.read([], 64, 0);
if(device.getLastReadSize() > 0) {
processResponse(data);
}

Deze functie retourneert het aantal bytes dat is gelezen door de laatste lees-/get_report-bewerking op het apparaat.

RetourTypeBeschrijvingVoorbeeld
BytesReadIntAantal bytes gelezen van het apparaat64

Hieronder is een voorbeeld van de Glorious Model 0-muis.

function CheckPacketLength(){
var packet = [0x52]
packet = device.get_report(packet,200) //attempts to read up to 200 bytes
return device.getLastReadSize(); //Returns 186 on a successful read of the config packet
}

Wist alle openstaande data in de leesbuffer van het apparaat. Roep dit aan vóór een kritieke leesbewerking om ervoor te zorgen dat u verse data ontvangt in plaats van een verouderde gebufferde reactie.

  • Opmerking: De bruikbaarheid van deze functie is afhankelijk van het apparaat en het eindpunt. Als het apparaat het leegmaken niet ondersteunt, kunt u het handmatig leeglopen door leesbewerkingen in een lus uit te voeren totdat device.getLastReadSize() 0 retourneert.
device.clearReadBuffer();
device.write(requestPacket, 64);
var response = device.read([], 64);

Deze functie probeert de leesbuffer van het apparaat volledig te wissen met het native flush-mechanisme van het apparaat. Geef de voorkeur aan device.clearReadBuffer() voor de meeste gebruikssituaties.

export function Initialize(){
device.flush()
if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){
EnableSoftwareControl();
}
}

Zie Geavanceerde communicatie voor volledige documentatie van control_transfer, bulk_transfer en input_report.