Программирование USB-кабеля передачи / разговор с драйвером устройства USB
Как программно получить доступ к USB-кабелю передачи (например, к кабелю передачи данных Belkin) из Windows?
Я знаком с libusb-win32, но из того, что я могу сказать, использование этого с более новыми устройствами и с Windows Vista кажется сомнительным.
Я знаю, что Windows Easy Transfer может сделать это. Как мне написать код, который делает то же самое, что и Windows Easy Transfer?
Если нет готовой документации о том, как это сделать, я готов кое-что сделать, но я не знаю, с чего начать. Как посмотреть, что делает Windows Easy Transfer, чтобы узнать, как она это делает? Я вижу, что Windows даже предоставляет кабели передачи своей собственной категории в диспетчере устройств, "Устройства передачи кабеля". Как выполнить низкоуровневую связь с одним из этих драйверов?
3 ответа
Я обнаружил, что Microsoft теперь предлагает WinUSB для простого взаимодействия в режиме пользователя с USB-устройствами. (Драйвер устройства WinUSB должен быть сначала установлен для устройства; это немного похоже на драйвер устройства libusb-win32.) WinUSB работает на XP (SP2 и выше) и Vista.
Easy Transfer Cable использует WinUSB для своего драйвера устройства, поэтому я смог связаться с ним, следуя примеру кода в документе Microsoft WinUSB.
Для этого вам нужно будет использовать низкоуровневый win32 API. У Microsoft есть несколько хороших примеров доступа к устройству Human Interface Device. Кабель передачи данных явно не HID, как мышь или клавиатура, но он соответствует спецификации HID.
Например, чтобы получить имя USB-устройства, которое вы бы назвали
HidD_GetProductString(...)
http://msdn.microsoft.com/en-us/library/ms790920.aspx
Там есть еще много чего, вы обязательно должны взглянуть на пример приложения c, который работает для всех версий Windows от 2000 до Vista.
http://msdn.microsoft.com/en-us/library/dd163258.aspx
Удачи!
У вас должен быть кабель передачи данных USB (также называемый кабелем передачи данных USB), который поддерживает API или SDK, а затем используйте следующий код:
void CU2uDlg::OnOK()
{
BYTE buf[65530];
LPU2URET pU2uRet;
BOOL bRet;
int ret;
CString msgstr;
ret = u2u_open();
if (ret == -1){
AfxMessageBox("Open U2U device Success.");
}else{
msgstr.Format("Open U2U device fail,return:%d", ret);
AfxMessageBox(msgstr);
return;
}
//send data
bRet = u2u_SendData(buf, 65530, ret);
if(!bRet)
{
msgstr.Format("Send data error,return:%d", ret);
AfxMessageBox(msgstr);
return;
}
//receive data
while (1){
bRet = u2u_RecvData(recvData, dataLen, ret);
if( !bRet )
{
msgstr.Format("Receive data error,return:%d", ret);
AfxMessageBox(msgstr);
u2u_close();
return;
}else{
break;
}
}
u2u_close();
}