跳到內容

寫入和讀取

這些函式是在外掛程式中與連接的 USB 裝置通訊的所有可用方式。命令根據裝置的協定分為兩種讀取和寫入類型,以及允許握手命令和進階功能的控制傳輸。

有關進階方法(bulk_transfercontrol_transferinput_report)和網路/串列通訊,請參閱進階通訊

此函式在裝置當前選定的端點上執行 Hid_Write 命令。這是大多數裝置使用的寫入函式,也是最常用的命令。

  • 注意:另一種寫入方式是 device.send_report。這是用於向裝置發送 HID 功能報告的寫入命令。功能與 device.write() 相同。
  • 注意:將長度設定為比提供的資料陣列更長,將在陣列末尾填充 0x00。
  • 注意:大多數 HID 裝置會在其寫入命令前面填充零。這是通過在 DataArray 前面放置一個額外的 0x00 並將長度增加一來完成的。這些值在資料傳輸期間被裝置移除。這主要發生在裝置的所選端點沒有 Report ID 的情況下。
參數類型說明範例
DataArray1D 陣列包含要發送到裝置的十六進位位元組的陣列[0x08,0xAB,0xFF,0x37]
LengthInt表示要發送的總封包長度的整數值4

以下是來自 ASUS LED 控制器的封包範例,顯示其建立和傳遞到裝置的過程。

var packet = [];
packet[0] = 0xEC; // 這是 Report ID
packet[1] = 0x40; // 命令
packet[2] = apply ? 0x80 | channel : channel; // 通道號
packet[3] = start; // 開始的 LED
packet[4] = count; // LED 數量
packet = packet.concat(RGBData); // [R,G,B ...] 格式的 RGB 值陣列
device.write(packet, 65); // 以 65 位元組寫入封包到裝置

此函式呼叫接受包含端點 Report ID 和要讀取的位元組長度的陣列,並在裝置上執行 Hid_Read。函式返回從裝置讀取的位元組陣列。有些裝置需要讀取以防止緩衝區溢出,偶爾也需要從裝置讀取設定資料。

  • 注意:另一種讀取方式是 device.get_report。這是用於從裝置獲取 HID 功能報告的讀取命令。功能與 device.read() 相同。
參數類型說明範例預設值
DataArray1D 陣列包含讀取命令所需的 Report ID 的陣列[0x08, 0x02]
LengthInt表示要讀取的位元組數的整數值65
TimeoutInt返回前等待資料的毫秒數。傳入 0 進行非阻塞檢查。100100
返回值類型說明範例
DataArray1D 陣列包含從裝置讀取的所有十六進位位元組的陣列,如果超時且無資料則為空陣列[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);
}

此函式返回上次對裝置執行讀取/get_report 讀取的位元組數。

返回值類型說明範例
BytesReadInt從裝置讀取的位元組數64

以下是來自 Glorious Model 0 滑鼠的範例。

function CheckPacketLength(){
var packet = [0x52]
packet = device.get_report(packet,200) // 嘗試讀取最多 200 位元組
return device.getLastReadSize(); // 成功讀取設定封包時返回 186
}

清除裝置讀取緩衝區中待處理的任何資料。在關鍵讀取之前呼叫此函式,以確保您收到的是新鮮資料而不是過時的緩衝響應。

  • 注意:此函式的有效性取決於裝置和端點。如果裝置不支援清空,請通過迴圈讀取手動清空,直到 device.getLastReadSize() 返回 0。
device.clearReadBuffer();
device.write(requestPacket, 64);
var response = device.read([], 64);

此函式嘗試使用裝置的原生清空機制完全清除裝置的讀取緩衝區。大多數使用情況下建議使用 device.clearReadBuffer()

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

有關 control_transferbulk_transferinput_report 的完整文件,請參閱進階通訊