寫入和讀取
這些函式是在外掛程式中與連接的 USB 裝置通訊的所有可用方式。命令根據裝置的協定分為兩種讀取和寫入類型,以及允許握手命令和進階功能的控制傳輸。
有關進階方法(bulk_transfer、control_transfer、input_report)和網路/串列通訊,請參閱進階通訊。
device.write()[send_report]
Section titled “device.write()[send_report]”此函式在裝置當前選定的端點上執行 Hid_Write 命令。這是大多數裝置使用的寫入函式,也是最常用的命令。
- 注意:另一種寫入方式是 device.send_report。這是用於向裝置發送 HID 功能報告的寫入命令。功能與 device.write() 相同。
- 注意:將長度設定為比提供的資料陣列更長,將在陣列末尾填充 0x00。
- 注意:大多數 HID 裝置會在其寫入命令前面填充零。這是通過在 DataArray 前面放置一個額外的 0x00 並將長度增加一來完成的。這些值在資料傳輸期間被裝置移除。這主要發生在裝置的所選端點沒有 Report ID 的情況下。
| 參數 | 類型 | 說明 | 範例 |
|---|---|---|---|
| DataArray | 1D 陣列 | 包含要發送到裝置的十六進位位元組的陣列 | [0x08,0xAB,0xFF,0x37] |
| Length | Int | 表示要發送的總封包長度的整數值 | 4 |
以下是來自 ASUS LED 控制器的封包範例,顯示其建立和傳遞到裝置的過程。
var packet = [];packet[0] = 0xEC; // 這是 Report IDpacket[1] = 0x40; // 命令packet[2] = apply ? 0x80 | channel : channel; // 通道號packet[3] = start; // 開始的 LEDpacket[4] = count; // LED 數量packet = packet.concat(RGBData); // [R,G,B ...] 格式的 RGB 值陣列
device.write(packet, 65); // 以 65 位元組寫入封包到裝置device.read()[get_report]
Section titled “device.read()[get_report]”此函式呼叫接受包含端點 Report ID 和要讀取的位元組長度的陣列,並在裝置上執行 Hid_Read。函式返回從裝置讀取的位元組陣列。有些裝置需要讀取以防止緩衝區溢出,偶爾也需要從裝置讀取設定資料。
- 注意:另一種讀取方式是 device.get_report。這是用於從裝置獲取 HID 功能報告的讀取命令。功能與 device.read() 相同。
| 參數 | 類型 | 說明 | 範例 | 預設值 |
|---|---|---|---|---|
| DataArray | 1D 陣列 | 包含讀取命令所需的 Report ID 的陣列 | [0x08, 0x02] | |
| Length | Int | 表示要讀取的位元組數的整數值 | 65 | |
| Timeout | Int | 返回前等待資料的毫秒數。傳入 0 進行非阻塞檢查。 | 100 | 100 |
| 返回值 | 類型 | 說明 | 範例 |
|---|---|---|---|
| DataArray | 1D 陣列 | 包含從裝置讀取的所有十六進位位元組的陣列,如果超時且無資料則為空陣列 | [0x08, 0x02,0x00,0x64] |
- 注意:此函式返回與裝置報告長度匹配的資料陣列。如果需要實際讀取的位元組數,請使用
device.getLastReadSize()。 - 注意:當超時且無資料時,返回值為空陣列,
device.getLastReadSize()返回0。
// 標準阻塞讀取(預設超時 100ms)var config = device.read(packet, 65);
// 非阻塞查看——立即返回,使用 getLastReadSize() 檢查資料是否到達var data = device.read([], 64, 0);if(device.getLastReadSize() > 0) { processResponse(data);}device.getLastReadSize()
Section titled “device.getLastReadSize()”此函式返回上次對裝置執行讀取/get_report 讀取的位元組數。
| 返回值 | 類型 | 說明 | 範例 |
|---|---|---|---|
| BytesRead | Int | 從裝置讀取的位元組數 | 64 |
以下是來自 Glorious Model 0 滑鼠的範例。
function CheckPacketLength(){
var packet = [0x52]
packet = device.get_report(packet,200) // 嘗試讀取最多 200 位元組
return device.getLastReadSize(); // 成功讀取設定封包時返回 186
}device.clearReadBuffer()
Section titled “device.clearReadBuffer()”清除裝置讀取緩衝區中待處理的任何資料。在關鍵讀取之前呼叫此函式,以確保您收到的是新鮮資料而不是過時的緩衝響應。
- 注意:此函式的有效性取決於裝置和端點。如果裝置不支援清空,請通過迴圈讀取手動清空,直到
device.getLastReadSize()返回 0。
device.clearReadBuffer();device.write(requestPacket, 64);var response = device.read([], 64);device.flush()
Section titled “device.flush()”此函式嘗試使用裝置的原生清空機制完全清除裝置的讀取緩衝區。大多數使用情況下建議使用 device.clearReadBuffer()。
export function Initialize(){ device.flush() if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){ EnableSoftwareControl(); }}device.control_transfer()
Section titled “device.control_transfer()”有關 control_transfer、bulk_transfer 和 input_report 的完整文件,請參閱進階通訊。