쓰기 및 읽기
이 함수들은 플러그인에서 연결된 USB 장치와 통신하는 모든 방법입니다. 명령은 장치의 프로토콜에 따라 두 가지 읽기 및 쓰기 방식과, 핸드셰이크 명령 및 고급 기능을 위한 제어 전송으로 구분됩니다.
고급 방법(bulk_transfer, control_transfer, input_report) 및 네트워크/시리얼 통신에 대해서는 고급 통신을 참조하십시오.
device.write()[send_report]
섹션 제목: “device.write()[send_report]”이 함수는 장치의 현재 선택된 엔드포인트에서 Hid_Write 명령을 수행합니다. 대부분의 장치에서 사용하는 쓰기 함수로, 가장 일반적으로 사용되는 명령입니다.
- 참고: 다른 형태의 쓰기는 _device.send_report_입니다. 이것은 장치에 HID 기능 보고서를 전송하는 데 사용되는 쓰기 명령입니다. 기능 면에서는 device.write()와 동일합니다.
- 참고: 제공된 데이터 배열보다 긴 길이를 설정하면 배열 끝이 0x00으로 채워집니다.
- 참고: 대부분의 HID 장치는 쓰기 명령 앞에 0을 패딩합니다. 데이터 배열 앞에 추가 0x00을 배치하고 길이를 하나 늘려서 수행합니다. 이 값들은 데이터 전송 중 장치에 의해 제거됩니다. 이는 주로 선택된 엔드포인트에 보고서 ID가 없을 때 발생합니다.
| 매개변수 | 유형 | 설명 | 예시 |
|---|---|---|---|
| DataArray | 1D 배열 | 장치에 전송할 16진수 바이트를 포함하는 배열 | [0x08,0xAB,0xFF,0x37] |
| Length | Int | 전송할 총 패킷 길이를 나타내는 정수 값 | 4 |
아래는 ASUS LED 컨트롤러의 패킷 생성 및 장치 전달 예시입니다.
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]”이 함수는 엔드포인트 보고서 ID와 읽을 바이트 길이를 포함하는 배열을 받아 장치에서 Hid_Read를 수행합니다. 함수는 장치에서 읽은 바이트 배열을 반환합니다. 일부 장치는 버퍼 오버플로를 방지하기 위해 읽기가 필요하며, 때로는 장치에서 설정 데이터를 읽어야 합니다.
- 참고: 다른 형태의 읽기는 _device.get_report_입니다. 장치에서 HID 기능 보고서를 가져오는 데 사용되는 읽기 명령입니다. 기능 면에서는 device.read()와 동일합니다.
| 매개변수 | 유형 | 설명 | 예시 | 기본값 |
|---|---|---|---|---|
| DataArray | 1D 배열 | 읽기 명령에 필요한 보고서 ID를 포함하는 배열 | [0x08, 0x02] | |
| Length | Int | 읽을 바이트 수를 나타내는 정수 값 | 65 | |
| Timeout | Int | 데이터를 반환하기 전 대기할 밀리초. 비차단 확인을 위해 0을 전달합니다. | 100 | 100 |
| 반환값 | 유형 | 설명 | 예시 |
|---|---|---|---|
| DataArray | 1D 배열 | 장치에서 읽은 모든 16진수 바이트를 포함하는 배열, 또는 타임아웃이 만료되면 빈 배열 | [0x08, 0x02,0x00,0x64] |
- 참고: 이 함수는 장치의 보고서 길이와 일치하는 데이터 배열을 반환합니다. 실제 읽은 바이트 수가 필요하면
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()”이 함수는 장치의 기본 플러시 메커니즘을 사용하여 장치의 읽기 버퍼를 완전히 지웁니다. 대부분의 경우 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의 전체 문서는 고급 통신을 참조하십시오.