Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
7 years, 8 months ago.
trying to implement usbhid with Nucleo F429ZI
Hello all,
iam trying to build a USBHid Device with the provided examples, that can be found here: https://developer.mbed.org/handbook/USBHID.
In general the example is working, but there arrives no data at the controller.
The statement if(hid.read(&recv_report)) in line 33 evaluates to true, when i send messages with the python code attached below, but the report always has a length of 0 and it contains no data.
The problem is the same with mbed 2 and mbed 5.
Does anybody got an idea of what might be wrong with my code?
slightly modified version of example
#include "mbed.h" #include "USBHID.h" //We declare a USBHID device. Input out output reports have a length of 8 bytes USBHID hid(8, 8); //This report will contain data to be sent HID_REPORT send_report; HID_REPORT recv_report; Serial pc(USBTX, USBRX); Timer debugTimer; int main(void) { debugTimer.start(); send_report.length = 8; while (1) { //Fill the report for (int i = 0; i < send_report.length; i++) { send_report.data[i] = rand() & 0xff; } //Send the report hid.send(&send_report); //try to read a msg if(hid.read(&recv_report)) { pc.printf("received at %d, length of report %d: ", debugTimer.read_us(), recv_report.length); for(int i = 0; i < 8; i++) { pc.printf("%d ", recv_report.data[i]); } pc.printf("\r\n"); } wait(0.2); } }
python side with pywinusb
import pywinusb.hid as hid from time import sleep import random # handler called when a report is received def rx_handler(data): print 'recv: ', data def findHIDDevice(mbed_usage, mbed_vendor_id): # Find all devices connected all_devices = hid.HidDeviceFilter(vendor_id = mbed_vendor_id).get_devices() if not all_devices: print "No device connected" else: # search for the Mbed for HIDdevice in all_devices: try: HIDdevice.open() # browse output reports for report in HIDdevice.find_output_reports(): if mbed_usage in report: #MBED found print 'Mbed detected' print report #Attach a custom handler when a data is received HIDdevice.set_raw_data_handler(rx_handler) #send a report each 0.2 second. The report is a random array of 8 bytes while True: for i in range(8): report[mbed_usage][i] = random.randint(0, 255) report.send() sleep(0.2) except: print 'close' print traceback.format_exc() HIDdevice.close() if __name__ == '__main__': # The vendor ID used in the Mbed program mbed_vendor_id = 0x1234 # Vendor page and usage_id = 2 mbed_usage = hid.get_full_usage_id(0xffab, 0x02) # Search the Mbed, attach rx handler and send data findHIDDevice(mbed_usage, mbed_vendor_id)
Maybe there is nothing wrong with the code. Have you checked using Putty with a second PC that the python is indeed sending the information. This could indicate that the hardware has a connection problem. Check for a good ground between the two devices. All the usual things.
posted by Darren Ulrich 01 Mar 2017Thanks a lot for your suggestion. My hardwaresetup is, that i connect the Nucleo board with one USB cable to the ST-Link, that powers the board and a second USB-cable to the CN13 USB port. No other cables are connected. I also tried it with the ST-Link cable unplugged and external power supply, but that does not help. I dont know, how i could improve the hardware connections so far.
Another thing: I dont know if you maybe missunderstood my setup concerning the suggestion with putty. Iam not talking about a serial communication, but a communication with raw data over a USB-HID interface. Or am i missing the fact that putty can listen to an usb connection, maybe?
posted by Step Mor 01 Mar 2017