Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.11.2012, 18:30
Аватар для fofka
fofka fofka вне форума
Начинающий
 
Регистрация: 12.10.2008
Сообщения: 163
Репутация: -1588
По умолчанию Управление нагрузкой

Добрый вечер всем.
Есть такой девайс http://www.masterkit.ru/main/set.php?code_id=573112
В "комплекте" есть программа, но хочется переделать под себя. Windows при подключении говорит что оборудование установлено, драйвера нашлись. Для начала как его увидеть из своей проги? Возможно кто то любопытный уже занимался с таким чудом. Собранно устройство на микроконтроллер ATtiny45.

Последний раз редактировалось fofka, 06.11.2012 в 19:18.
Ответить с цитированием
  #2  
Старый 06.11.2012, 21:28
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 297
Репутация: -1806
По умолчанию

с учетом того что силовых элементов там все равно нет проще и дешесле это сделать на банальном LPT порту
Ответить с цитированием
  #3  
Старый 06.11.2012, 21:36
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

С ЮСБшником этим попробуй как с ком портом поработать.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 06.11.2012 в 21:39.
Ответить с цитированием
  #4  
Старый 06.11.2012, 21:58
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
С ЮСБшником этим попробуй как с ком портом поработать.
Не выйдет. Тем более, раз были дрова.

Посмотри на девайс в диспетчере устройств винды. Если оно HID (Human Interface Device) - напишу, как работать с HID'ами. В противном случае только реверс изначальной проги. Да и в случае HID'а протокол придется восстанавливать.

UPD: Судя по некоторым названиям функций, оно-таки HID, притом писали на делфе с использованием некого компонента. Поищи его (что-то вроде Jvhidcontrollerclass).
Цитата:
Сообщение от mp710
Jvhidcontrollerclass::TJvHidDevice::GetVendorName
Jvhidcontrollerclass::TJvHidDevice::OpenFile

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;
}
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 06.11.2012 в 22:09.
Ответить с цитированием
  #5  
Старый 07.11.2012, 07:56
Аватар для fofka
fofka fofka вне форума
Начинающий
 
Регистрация: 12.10.2008
Сообщения: 163
Репутация: -1588
По умолчанию

Bargest, в диспетчере при подключении появляется еще один Human Interface Device. Так что если подскажите как работать с usb буду благодарен. Попробовал "exe" декомпилировать, в приложении.
Вложения
Тип файла: rar MP710_V1.rar (323.9 Кбайт, 4 просмотров)
Ответить с цитированием
  #6  
Старый 07.11.2012, 14:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Раз оно 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;
Это из одного моего проекта "на коленке". vid_0483&pid_5750 - соответственно VID и PID устройства, можно получить в диспетчере устройств. Обязательно четырехзначные. Код был восстановлен по дизасу и декомпайлу немецкой проги, работавшей с тем же девайсом.
Дальше все просто: чтение - ReadFile, запись - WriteFile, закрытие - CloseHandle.
Тут опять же придется реверсить протокол обмена. Можно попробовать какой-нибудь USB-сниффер или реверсить код. Я бы со снифферами не связывался.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 07.11.2012 в 14:11.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025