การเขียนและการอ่าน
ฟังก์ชันเหล่านี้คือวิธีทั้งหมดที่มีให้ใช้ในการสื่อสารกับอุปกรณ์ USB ที่เชื่อมต่ออยู่ในปลั๊กอินของคุณ คำสั่งแบ่งออกเป็นการอ่านและการเขียนสองรูปแบบตามโปรโตคอลของอุปกรณ์ และการถ่ายโอนแบบ control ซึ่งรองรับคำสั่งแฮนด์เชกและฟังก์ชันขั้นสูง
สำหรับเมธอดขั้นสูง (bulk_transfer, control_transfer, input_report) และการสื่อสารผ่านเครือข่าย/ซีเรียล โปรดดู การสื่อสารขั้นสูง
device.write()[send_report]
หัวข้อที่มีชื่อว่า “device.write()[send_report]”ฟังก์ชันนี้ทำคำสั่ง Hid_Write บนเอนด์พอยต์ที่เลือกไว้ในปัจจุบันของอุปกรณ์ นี่คือฟังก์ชันเขียนที่อุปกรณ์ส่วนใหญ่ใช้และจะเป็นคำสั่งที่ใช้บ่อยที่สุด
- หมายเหตุ: การเขียนอีกรูปแบบหนึ่งคือ device.send_report ซึ่งเป็นคำสั่งเขียนที่ใช้ส่ง HID feature report ไปยังอุปกรณ์ นอกนั้นทำงานเหมือนกับ device.write()
- หมายเหตุ: การกำหนดความยาวที่ยาวกว่าอาร์เรย์ข้อมูลที่ระบุจะเติม 0x00 ที่ส่วนท้ายของอาร์เรย์
- หมายเหตุ: อุปกรณ์ HID ส่วนใหญ่จะใช้ zero padding ที่ส่วนหน้าของคำสั่งเขียน ซึ่งทำได้โดยใส่ 0x00 เพิ่มหนึ่งตัวไว้หน้า DataArray และเพิ่มความยาวขึ้นหนึ่ง ค่าเหล่านี้จะถูกอุปกรณ์ลบออกระหว่างการถ่ายโอนข้อมูล กรณีนี้เกิดขึ้นเป็นหลักเมื่ออุปกรณ์ไม่มี Report ID สำหรับเอนด์พอยต์ที่เลือก
| พารามิเตอร์ | ชนิด | คำอธิบาย | ตัวอย่าง |
|---|---|---|---|
| DataArray | อาร์เรย์ 1 มิติ | อาร์เรย์ที่มีไบต์ฐานสิบหกที่จะส่งไปยังอุปกรณ์ | [0x08,0xAB,0xFF,0x37] |
| Length | Int | ค่า Int ที่แทนความยาวแพ็กเก็ตทั้งหมดที่จะส่ง | 4 |
ด้านล่างนี้คือตัวอย่างแพ็กเก็ตจากคอนโทรลเลอร์ LED ของ ASUS ที่แสดงการสร้างและการส่งไปยังอุปกรณ์
var packet = [];packet[0] = 0xEC; //This is the Report Idpacket[1] = 0x40; //Commandpacket[2] = apply ? 0x80 | channel : channel; //Channel Numberpacket[3] = start; //Led to Start onpacket[4] = count; //Led Countpacket = 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 Bytesdevice.read()[get_report]
หัวข้อที่มีชื่อว่า “device.read()[get_report]”การเรียกฟังก์ชันนี้รับอาร์เรย์ที่มี Report Id ของเอนด์พอยต์และความยาวไบต์ที่จะอ่าน แล้วทำ Hid_Read บนอุปกรณ์ ฟังก์ชันจะส่งคืนอาร์เรย์ของไบต์ที่อ่านได้จากอุปกรณ์ อุปกรณ์บางรุ่นต้องมีการอ่านเพื่อป้องกันบัฟเฟอร์ล้น และบางครั้งก็จำเป็นต้องอ่านข้อมูลการกำหนดค่าหรือการตั้งค่าจากอุปกรณ์
- หมายเหตุ: การอ่านอีกรูปแบบหนึ่งคือ device.get_report ซึ่งเป็นคำสั่งอ่านที่ใช้รับ HID feature report จากอุปกรณ์ นอกนั้นทำงานเหมือนกับ device.read()
| พารามิเตอร์ | ชนิด | คำอธิบาย | ตัวอย่าง | ค่าเริ่มต้น |
|---|---|---|---|---|
| DataArray | อาร์เรย์ 1 มิติ | อาร์เรย์ที่มี report Id ที่จำเป็นสำหรับคำสั่งอ่าน | [0x08, 0x02] | |
| Length | Int | ค่า Int ที่แทนจำนวนไบต์ที่จะอ่าน | 65 | |
| Timeout | Int | จำนวนมิลลิวินาทีที่จะรอข้อมูลก่อนส่งคืน ส่ง 0 สำหรับการตรวจสอบแบบไม่บล็อก | 100 | 100 |
| ค่าที่ส่งคืน | ชนิด | คำอธิบาย | ตัวอย่าง |
|---|---|---|---|
| DataArray | อาร์เรย์ 1 มิติ | อาร์เรย์ที่มีไบต์ HEX ทั้งหมดที่อ่านได้จากอุปกรณ์ หรืออาร์เรย์ว่างหากหมดเวลาโดยไม่มีข้อมูล | [0x08, 0x02,0x00,0x64] |
- หมายเหตุ: ฟังก์ชันนี้ส่งคืน Data Array ที่มีความยาวตรงกับความยาว report ของอุปกรณ์ หากคุณต้องการจำนวนไบต์ที่อ่านได้จริง ให้ใช้
device.getLastReadSize() - หมายเหตุ: เมื่อหมดเวลาโดยไม่มีข้อมูล ค่าที่ส่งคืนจะเป็นอาร์เรย์ว่าง และ
device.getLastReadSize()จะส่งคืน0
// Standard blocking read (100ms default timeout)var config = device.read(packet, 65);
// Non-blocking peek — returns immediately, use getLastReadSize() to check if data arrivedvar data = device.read([], 64, 0);if(device.getLastReadSize() > 0) { processResponse(data);}device.getLastReadSize()
หัวข้อที่มีชื่อว่า “device.getLastReadSize()”ฟังก์ชันนี้ส่งคืนจำนวนไบต์ที่อ่านได้จากการ read/get_report ครั้งล่าสุดกับอุปกรณ์
| ค่าที่ส่งคืน | ชนิด | คำอธิบาย | ตัวอย่าง |
|---|---|---|---|
| BytesRead | Int | จำนวนไบต์ที่อ่านได้จากอุปกรณ์ | 64 |
ด้านล่างนี้คือตัวอย่างจากเมาส์ Glorious Model 0
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
}device.clearReadBuffer()
หัวข้อที่มีชื่อว่า “device.clearReadBuffer()”ล้างข้อมูลที่ค้างอยู่ในบัฟเฟอร์การอ่านของอุปกรณ์ เรียกฟังก์ชันนี้ก่อนการอ่านที่สำคัญ เพื่อให้แน่ใจว่าคุณได้รับข้อมูลใหม่แทนที่จะเป็นการตอบกลับเก่าที่ค้างอยู่ในบัฟเฟอร์
- หมายเหตุ: ประโยชน์ของฟังก์ชันนี้ขึ้นอยู่กับอุปกรณ์และเอนด์พอยต์ หากอุปกรณ์ไม่รองรับการล้างบัฟเฟอร์ ให้ระบายข้อมูลออกด้วยตนเองโดยวนอ่านจนกว่า
device.getLastReadSize()จะส่งคืน 0
device.clearReadBuffer();device.write(requestPacket, 64);var response = device.read([], 64);device.flush()
หัวข้อที่มีชื่อว่า “device.flush()”ฟังก์ชันนี้พยายามล้างบัฟเฟอร์การอ่านของอุปกรณ์ทั้งหมดโดยใช้กลไก flush ดั้งเดิมของอุปกรณ์ สำหรับกรณีการใช้งานส่วนใหญ่ แนะนำให้ใช้ device.clearReadBuffer() แทน
export function Initialize(){ device.flush() if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){ EnableSoftwareControl(); }}device.control_transfer()
หัวข้อที่มีชื่อว่า “device.control_transfer()”ดู การสื่อสารขั้นสูง สำหรับเอกสารฉบับเต็มของ control_transfer, bulk_transfer และ input_report