Skrivningar och läsningar
Dessa funktioner är alla tillgängliga sätt att kommunicera med anslutna USB-enheter i dina plugins. Kommandona delas upp i två typer av läsningar och skrivningar och kontrolltransfererings-kommandon som möjliggör handskakning och avancerad funktionalitet, beroende på enhetens protokoll.
För avancerade metoder (bulk_transfer, control_transfer, input_report) och nätverks-/seriekommunikation, se sidan Avancerad kommunikation.
device.write()[send_report]
Section titled “device.write()[send_report]”Den här funktionen utför ett Hid_Write-kommando på enhetens valda slutpunkt. Det här är skrivfunktionen som de flesta enheter använder och det kommer att vara det vanligast använda kommandot.
- Obs: En annan variant av write är device.send_report. Det här är det skrivkommando som används för att skicka HID-funktionsrapporter till enheten. Det är funktionellt identiskt med device.write().
- Obs: Om du anger en längd som är längre än den angivna dataarrayen fylls slutet av arrayen med 0x00.
- Obs: De flesta HID-enheter nollutfyller skrivkommandon. Det görs genom att placera en extra 0x00 framför DataArray och öka längden med ett; dessa värden tas bort av enheten under dataöverföring. Det här sker primärt när den valda slutpunkten för enheten inte har ett rapport-ID.
| Parameter | Typ | Beskrivning | Exempel |
|---|---|---|---|
| DataArray | 1D Array | En array som innehåller hex-bytes som ska skickas till enheten | [0x08,0xAB,0xFF,0x37] |
| Length | Int | Ett int-värde som representerar den totala paketlängden som ska skickas | 4 |
Nedan finns ett paketexempel från ASUS LED-styrenheter som visar konstruktion och leverans till enheten.
var packet = [];packet[0] = 0xEC; // Det här är rapport-ID:tpacket[1] = 0x40; // Kommandopacket[2] = apply ? 0x80 | channel : channel; // Kanalnummerpacket[3] = start; // Start-LEDpacket[4] = count; // Antal lysdioderpacket = packet.concat(RGBData); // Array med RGB-värden i formatet [R,G,B ...]
device.write(packet, 65); // Skriv paketet till enheten som 65 bytedevice.read()[get_report]
Section titled “device.read()[get_report]”Det här funktionsanropet tar en array som innehåller slutpunktens rapport-ID och byte-längden som ska läsas och utför ett Hid_Read på enheten. Funktionen returnerar byte-arrayen som lästs från enheten. Vissa enheter kräver läsningar för att förhindra buffertöversvämningar och ibland finns det behov av att läsa konfigurationsdata eller inställningsdata från enheter.
- Obs: En annan variant av read är device.get_report. Det här är det läskommando som används för att hämta HID-funktionsrapporter från enheten. Det är funktionellt identiskt med device.read().
| Parameter | Typ | Beskrivning | Exempel | Standard |
|---|---|---|---|---|
| DataArray | 1D Array | Array som innehåller det rapport-ID som krävs för läskommandot | [0x08, 0x02] | |
| Length | Int | Ett int-värde som representerar antalet bytes att läsa | 65 | |
| Timeout | Int | Millisekunder att vänta på data innan det returneras. Skicka 0 för icke-blockerande kontroll. | 100 | 100 |
| Returnerar | Typ | Beskrivning | Exempel |
|---|---|---|---|
| DataArray | 1D Array | Array som innehåller alla HEX-bytes som lästs från enheten, eller tom array om timeout löpte ut utan data | [0x08, 0x02,0x00,0x64] |
- Obs: Den här funktionen returnerar en DataArray som matchar enhetens rapportlängd. Om du behöver det faktiska antalet lästa bytes, använd
device.getLastReadSize(). - Obs: När timeout löper ut utan data är det returnerade värdet en tom array och
device.getLastReadSize()returnerar0.
// Standard blockerande läsning (standard 100ms timeout)var config = device.read(packet, 65);
// Icke-blockerande kontroll — returnerar omedelbart, använd getLastReadSize() för att kontrollera om data komvar data = device.read([], 64, 0);if(device.getLastReadSize() > 0) { processResponse(data);}device.getLastReadSize()
Section titled “device.getLastReadSize()”Den här funktionen returnerar antalet bytes som lästs av den senaste read/get_report till enheten.
| Returnerar | Typ | Beskrivning | Exempel |
|---|---|---|---|
| BytesRead | Int | Antalet bytes lästa från enheten | 64 |
Nedan finns ett exempel från Glorious Model 0-musen.
function CheckPacketLength(){
var packet = [0x52]
packet = device.get_report(packet,200) // Försöker läsa upp till 200 bytes
return device.getLastReadSize(); // Returnerar 186 vid lyckad läsning av konfigurationspaketet
}device.clearReadBuffer()
Section titled “device.clearReadBuffer()”Rensar all väntande data i enhetens läsbuffert. Anropa detta före en kritisk läsning för att säkerställa att du får färsk data istället för ett föråldrat buffrat svar.
- Obs: Användbarheten hos den här funktionen beror på enheten och slutpunkten. Om enheten inte stödjer rensning, töm manuellt genom att loopa läsningar tills
device.getLastReadSize()returnerar 0.
device.clearReadBuffer();device.write(requestPacket, 64);var response = device.read([], 64);device.flush()
Section titled “device.flush()”Den här funktionen försöker fullständigt rensa enhetens läsbuffert med enhetens inbyggda rensningsmekanik. Föredra device.clearReadBuffer() för de flesta användningsfall.
export function Initialize(){ device.flush() if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){ EnableSoftwareControl(); }}device.control_transfer()
Section titled “device.control_transfer()”För fullständig dokumentation av control_transfer, bulk_transfer och input_report, se sidan Avancerad kommunikation.