2013-05-03 2 views
1

저는 pywinusb를 사용하여 출력 보고서를 pic18f4550에 보내려고합니다. 이 장치는 데이터를받을 수 있으며 C# 응용 프로그램으로 테스트 해 보았습니다. 또한 pywinusb로 데이터를 읽을 수는 있지만 데이터를 보내려는 문제가 있습니다. 그것은이 오류가 발생python/pywinusb를 사용하여 장치에 hid 데이터를 보내는 방법은 무엇입니까?

from pywinusb import hid 

filter = hid.HidDeviceFilter(vendor_id = 0x0777, product_id = 0x0077) 
devices = filter.get_devices() 

if devices: 
    device = devices[0] 
    print "success" 

device.open() 
out_report = device.find_output_reports()[0] 

buffer= [0x00]*65 
buffer[0]=0x0 
buffer[1]=0x01 
buffer[2]=0x00 
buffer[3]=0x01 

out_report.set_raw_data(buffer) 
out_report.send() 
dev.close() 

:

success 
Traceback (most recent call last): 
    File "C:\Users\7User\Desktop\USB PIC18\out.py", line 24, in <module> 
    out_report.send() 
    File "build\bdist.win32\egg\pywinusb\hid\core.py", line 1451, in send 
    self.__prepare_raw_data() 
    File "build\bdist.win32\egg\pywinusb\hid\core.py", line 1406, in __prepare_raw_data 
    byref(self.__raw_data), self.__raw_report_size)) 
    File "build\bdist.win32\egg\pywinusb\hid\winapi.py", line 382, in __init__ 
    raise helpers.HIDError("hidP error: %s" % self.error_message_dict[error_code]) 
HIDError: hidP error: data index not found 

답변

4

것은 여기 내 코드와는 TI의 데이터 파이프 USB 스택을 실행하는 MSP430F 칩을 작동

는 여기에 내가 실행 해요 코드입니다. 이것은 기본적으로 사용자 정의 데이터 파이프 역할을하는 입력 및 출력 엔드 포인트입니다. 첫 번째 바이트는 ID 번호 (TI로 정의 됨) 인 10 진수 63을 제외하고 원하는 모든 형식으로 64 바이트를 전송할 수 있습니다. 두 번째 바이트는 위에서 설명한 처음 두 바이트의 패킷 (최대 64 바이트 패킷)의 관련 또는 유용한 바이트 수입니다. 문서가 부족하여 대부분 이것을 파악하는 데 시간이 걸렸습니다. pywinusb와 함께 제공되는 몇 가지 예는 기껏해야 배울 수 없습니다. 어쨌든 여기 내 코드가 있습니다. 그것은 내 마이크로와 함께 일하고있어서 이것이 당신을 도울 것입니다. 당신을 속이고 수 있습니다

 filter = hid.HidDeviceFilter(vendor_id = 0x2048, product_id = 0x0302) 
    hid_device = filter.get_devices() 
    device = hid_device[0] 
    device.open() 
    print(hid_device) 


    target_usage = hid.get_full_usage_id(0x00, 0x3f) 
    device.set_raw_data_handler(sample_handler) 
    print(target_usage) 


    report = device.find_output_reports() 

    print(report) 
    print(report[0]) 

    buffer = [0xFF]*64 
    buffer[0] = 63 

    print(buffer) 

    report[0].set_raw_data(buffer) 
    report[0].send() 

하나 개의 영역은 여기에 있습니다 :

out_report = device.find_output_reports()[0] 

는 "out_report = device.find_output_reports()"를 "[0]"에서 말없이 사용해보십시오. 다음

out_report[0].set_raw_data(buffer) 

사용하고 마지막으로

out_report[0].send() 

희망이 당신을 도와줍니다.

+0

:-) 비트 폭 및 위치를 추측하지 않고, 독립적으로 보고서 항목을 변경할 수있을 것. find_output_reports()'출력 보고서를 찾지 못합니까? 그것은 항상 나를 위해'[]'를 반환합니다. –

0

HID는 정말 강력하지만 아무도 적절한 HID 열거 형을 사용하지 않으므로 HID는 보고서의 형식을 설명하기위한 매우 유연한 스키마를 제공합니다.

간단한 장치의 경우 시작하기 위해 간단한 바이트 배열 사용을 권장합니다. 이렇게하면 호스트 응용 프로그램에서 데이터 항목의 컨텍스트를 제공하게됩니다. [:] 주어진 출력 보고서, 다음 직접 '원시'요소를 변경

어쨌든, 원시 보고서는 여기에 우리가

사용 starting_data = output_report.get_raw_data이() ... 다시 간다.

은 물론, 이상적으로 장치 '어떻게 내가 출력 보고서를 보낼 수 있습니다 제대로 사용을 정의한 것입니다 그리고 당신은