![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Добрый вечер всем.
Есть такой девайс http://www.masterkit.ru/main/set.php?code_id=573112 В "комплекте" есть программа, но хочется переделать под себя. Windows при подключении говорит что оборудование установлено, драйвера нашлись. Для начала как его увидеть из своей проги? Возможно кто то любопытный уже занимался с таким чудом. Собранно устройство на микроконтроллер ATtiny45. Последний раз редактировалось fofka, 06.11.2012 в 19:18. |
|
#2
|
|||
|
|||
|
с учетом того что силовых элементов там все равно нет проще и дешесле это сделать на банальном LPT порту
|
|
#3
|
||||
|
||||
|
С ЮСБшником этим попробуй как с ком портом поработать.
Последний раз редактировалось M.A.D.M.A.N., 06.11.2012 в 21:39. |
|
#4
|
||||
|
||||
|
Цитата:
Посмотри на девайс в диспетчере устройств винды. Если оно HID (Human Interface Device) - напишу, как работать с HID'ами. В противном случае только реверс изначальной проги. Да и в случае HID'а протокол придется восстанавливать. UPD: Судя по некоторым названиям функций, оно-таки HID, притом писали на делфе с использованием некого компонента. Поищи его (что-то вроде Jvhidcontrollerclass). Цитата:
UPD2: Видимо чтение так: Код:
bool __fastcall Jvhidcontrollerclass::TJvHidDevice::ReadFile(int a1, LPVOID lpBuffer, DWORD a3, LPDWORD lpNumberOfBytesRead)
{
void *v4; // edi@1
int v5; // esi@1
bool v6; // ebx@1
DWORD nNumberOfBytesToRead; // [sp+Ch] [bp-4h]@1
nNumberOfBytesToRead = a3;
v4 = lpBuffer;
v5 = a1;
v6 = 0;
if ( (unsigned __int8)Jvhidcontrollerclass::TJvHidDevice::OpenFile(a1) )
v6 = (unsigned int)ReadFile(*(HANDLE *)(v5 + 12), v4, nNumberOfBytesToRead, lpNumberOfBytesRead, 0) >= 1;
return v6;
}Последний раз редактировалось Bargest, 06.11.2012 в 22:09. |
|
#5
|
||||
|
||||
|
Bargest, в диспетчере при подключении появляется еще один Human Interface Device. Так что если подскажите как работать с usb буду благодарен. Попробовал "exe" декомпилировать, в приложении.
|
|
#6
|
||||
|
||||
|
Раз оно HID - варианта два. Первый - использовать ту же библиотеку, что юзают разработчики (Jvhidcontrollerclass). Тут придется реверсить способ работы с этим компонентом (т.к. я особо по нему ничего в гугле не нашел, хотя не особо искал) и протокол.
Второй: Код:
procedure TfrmMultiMeter.tbConnectClick(Sender: TObject);
var
devSet: integer;
i, uBytes: integer;
spdt: SP_DEVICE_INTERFACE_DATA;
begin
if connected then
begin
MessageBoxA(0, 'Вы уже подключены к устройству.', 'Ошибка!', 0);
exit;
end;
hHid := LoadLibrary('Hid.dll');
if hHid = 0 then
begin
MessageBoxA(0, 'Не удалось загрузить библиотеку Hid.dll', 'Ошибка!', 0);
exit;
end;
hSetupAPI := LoadLibrary('SetupAPI.dll');
if hSetupAPI = 0 then
begin
DoDisconnect();
MessageBoxA(0, 'Не удалось загрузить библиотеку SetupAPI.dll',
'Ошибка!', 0);
exit;
end;
HidD_GetHidGuid := GetProcAddress(hHid, 'HidD_GetHidGuid');
SetupDiGetClassDevsA := GetProcAddress(hSetupAPI, 'SetupDiGetClassDevsA');
SetupDiDestroyDeviceInfoList := GetProcAddress(hSetupAPI,
'SetupDiDestroyDeviceInfoList');
SetupDiEnumDeviceInterfaces := GetProcAddress(hSetupAPI,
'SetupDiEnumDeviceInterfaces');
SetupDiGetDeviceInterfaceDetailA := GetProcAddress(hSetupAPI,
'SetupDiGetDeviceInterfaceDetailA');
if (not assigned(HidD_GetHidGuid)) or (not assigned(SetupDiGetClassDevsA)) or
(not assigned(SetupDiDestroyDeviceInfoList)) or
(not assigned(SetupDiEnumDeviceInterfaces)) or
(not assigned(SetupDiGetDeviceInterfaceDetailA)) then
begin
DoDisconnect();
MessageBoxA(0, 'Не удалось получить адрес функции.', 'Ошибка!', 0);
exit;
end;
HidD_GetHidGuid(@Hg);
devSet := SetupDiGetClassDevsA(@Hg, 0, 0, $12);
if devSet = -1 then
begin
DoDisconnect();
MessageBoxA(0, 'Не получен список устройств.', 'Ошибка!', 0);
exit;
end;
i := 0;
spdt.cbSize := sizeof(spdt);
while SetupDiEnumDeviceInterfaces(devSet, 0, @Hg, i, @spdt) do
begin
SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, 0, 0, @uBytes, 0);
if (uBytes <> 0) and (GetLastError() = 122) then
begin
GetMem(pSpDDT, uBytes);
pSpDDT^.cbSize := 5;
SetupDiGetDeviceInterfaceDetailA(devSet, @spdt, pSpDDT, uBytes,
@uBytes, 0);
if (pos('vid_0483&pid_5750', PAnsiChar(@(pSpDDT^.DevicePath))) <> 0) then
break;
FreeMem(pSpDDT);
pSpDDT := 0;
end;
inc(i);
end;
SetupDiDestroyDeviceInfoList(devSet);
if pSpDDT = nil then
begin
DoDisconnect();
MessageBoxA(0, 'Устройство vid_0483&pid_5750 не найдено.', 'Ошибка!', 0);
exit;
end;
hMM := CreateFileA(PAnsiChar(@(pSpDDT^.DevicePath)), GENERIC_READ or
GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
if hMM = 0 then
begin
DoDisconnect();
MessageBoxA(0, 'Не удалось открыть устройство.', 'Ошибка!', 0);
exit;
end;
hEvt := CreateEvent(0, true, false, 0);
ResetEvent(hEvt);
ovlp.Offset := 0;
ovlp.OffsetHigh := 0;
ovlp.hEvent := hEvt;
reading := false;
connected := true;
tmRead.Enabled := true;
end;Дальше все просто: чтение - ReadFile, запись - WriteFile, закрытие - CloseHandle. Тут опять же придется реверсить протокол обмена. Можно попробовать какой-нибудь USB-сниффер или реверсить код. Я бы со снифферами не связывался. Последний раз редактировалось Bargest, 07.11.2012 в 14:11. |