Консультация № 186786
07.11.2012, 10:22
110.66 руб.
0 19 1
Здравствуйте! У меня возникли сложности с таким вопросом: Приобрел такой http://www.masterkit.ru/main/set.php?code_id=573112 девайс. На сайте магазина есть ехе-шник с программой. С магазинной программой работает. Хочу сделать программу в Delphi так как мне нужно. Тут сразу возникло несколько вопросов, так как с портами не работал.
1. Определение что оборудование подключено.
2. Передача данных и получение состояния каналов.
3. Сохранение и запись файла конфигурации.

При подключении к компьютеру сообщение что драйвера установлены (Windows 7), в диспетчере устройств появляется еще один Human Interface Device.

В интернете поискал примеры по работе USB, если пишу JvHidControllerClass, JvComponentBase, при попытке компиляции выдает ошибку. Получается что у меня нет данной библиотеки?

Заранее благодарю за любую помощь.

Обсуждение

давно
Посетитель
352040
133
07.11.2012, 10:34
общий
Забыл добавить что собранно устройство на микроконтроллер ATtiny45.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
07.11.2012, 11:17
общий
Адресаты:
А Вы, случаем, JVCL не забыли скачать? Судя по названию, эти модули как раз оттуда.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
07.11.2012, 11:26
общий
Адресаты:
Забыл. Скачивать все!
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
07.11.2012, 12:01
общий
07.11.2012, 12:01
Адресаты:
Можно скачать только Source и Example. В зависимости от того, какие модули Вам нужны, будете класть именно их в каталог с Вашим проектом. Правда там зависимостей много, поэтому всё равно придётся всё подряд компилировать и откомпилированные модули JVCL сложить в каталог, где установлен Ваш Delphi в подкаталог Lib, т.е. где лежат откомпилированные модули самого Delphi.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
07.11.2012, 12:30
общий
Адресаты:
Если у меня в uses обьявлены JvHidControllerClass и JvComponentBase то в проект я добавляю эти модули (JvHidControllerClass.pas). И если можно подробней о
всё подряд компилировать и откомпилированные модули JVCL сложить в каталог, где установлен Ваш Delphi в подкаталог Lib, т.е. где лежат откомпилированные модули самого Delphi.
. Что бы уже в дальнейшем не добавлять к проекту модули.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
07.11.2012, 14:17
общий
Адресаты:
Подкаталог Lib - это каталог по умолчанию, где расположены откомпилированные модули самого Delphi. Расположение этого каталога в свойствах проекта указывать не надо, т.к. Delphi о нём и так знает.
Если Вы попытаетесь компилировать любой из нужных Вам модулей (JvHidControllerClass и JvComponentBase), то компиляция будет останавливаться с ошибкой, что не хватает ещё какого-нибудь модуля. Поэтому придётся каждый раз добавлять требуемый модуль и компилировать опять. Как только ошибоки "не найден модуль" перестанут появляться - Вы счастливчик, все необходимые модули из JVCL собраны и откомпилированы. Теперь остаётся скопировать файлы с расширением dcu и dfm в подкаталог Lib.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
07.11.2012, 18:58
общий
07.11.2012, 19:22
Адресаты:
А каким образом мне получить файлы с расширением dcu и dfm (JvHidControllerClass и JvComponentBase)? Погуглил, отыскал такой совет
Создаём новый проект, далее добавляем модуль нужный pas (Project->Add To Project), компилируем (Ctrl+F9) и-вуаля- получаем dcu этого pas'а.
Получаю - [Fatal Error] Unit1.pas(7): Unit name mismatch: 'JvComponentBase'
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
07.11.2012, 19:55
общий
07.11.2012, 19:55
Адресаты:
Цитата: Владимир
Unit name mismatch

Проверьте, соответствует ли название файла модуля названию модуля.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
08.11.2012, 11:47
общий
08.11.2012, 11:48
Адресаты:
Добрый день. Вот уж танцы с бубуном! Получилось скомпилировать JvComponentBase.pas. Получил JvComponentBase.dcu, JvComponentBase.dfm не получил. При попытке скомпилировать JvHidControllerClass.pas получаю ошибку
Код:
[Fatal Error] JvHidControllerClass.pas(41): File not found: 'DBT.dcu'


Часть кода из JvHidControllerClass
Код:
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Windows, Messages, Classes, SysUtils,
JvComponentBase,
DBT, JvSetupApi, Hid, JvTypes;

const
// a version string for the component
cHidControllerClassVersion = '1.0.35';

// strings from the registry for CheckOutByClass
cHidNoClass = 'HIDClass';


P.S. Еще вопрос. Это единственный способ работы с USB устройствами? Хочется разобратся, не думал что так все запущено.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
08.11.2012, 12:29
общий
Адресаты:
1. Файлы с расширением .dfm - это файл формы с находящимися на них компонентами. Если формы нет, то и файла с таким расширением тоже не будет.
2.
Цитата: Владимир
File not found: 'DBT.dcu'

файл DBT.pas находится в том же каталоге, что и JvHidControllerClass.pas.
3.
Цитата: Владимир
Это единственный способ работы с USB устройствами?

Нет, не единственный, но более-менее простой. Остальные способы, например, через WinAPI, ещё более замороченные. К примеру, Вы никогда не пытались работать с формой только функциями WinAPI? Будете потрясены до глубины души и бросите программирование навсегда.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
08.11.2012, 12:32
общий
это ответ
Здравствуйте, Владимир!

Вам необходимо скачать JVCL, т.к. требуемые для Вашей задачи модули (JvHidControllerClass, JvComponentBase) находятся именно там.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
08.11.2012, 18:19
общий
Адресаты:
Понятно. Значит будем дальше разбиратся. WinAPI не буду и пробовать. Хотя уже есть желание все закинуть в угол (не получается)!
Хочу попробовать этот код за основу использовать.
Код:
unit main;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
StdCtrls, Buttons, JvHidControllerClass, JvComponentBase;

type
TReportData = array [0..7] of Byte; // размер буфера репорта HID

TForm1 = class(TForm)
HidCtl: TJvHidDeviceController;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
CheckBox0: TCheckBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
CheckBox7: TCheckBox;

procedure HidCtlArrival(HidDev: TJvHidDevice);
function HidCtlEnumerate(HidDev: TJvHidDevice;
const Idx: Integer): Boolean;
procedure HidCtlRemoval(HidDev: TJvHidDevice);
function WorkDevSetFeature(Buf: TReportData): Boolean;
procedure CheckBoxClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
WorkDev : TJvHidDevice;
end;

const
// Описание устройства
ProductName_ = 'LED USB Device';
VendorID_ = $16c0;
ProductID_ = $05df;

var
Form1 : TForm1;

implementation

{$R *.dfm}


procedure TForm1.HidCtlArrival(HidDev: TJvHidDevice);
// Обработчик подключения нового устройства
// событие OnArrival от HidCtl
begin
// если устройство не определено, то вызываем энумерацию
If not Assigned(WorkDev) then HidCtl.Enumerate
end;


function TForm1.HidCtlEnumerate(HidDev: TJvHidDevice;
const Idx: Integer): Boolean;
// Поиск нужного устройства из всех подключенных
// событие OnEnumerate от HidCtl
begin
Result:= True; // продолжать поиск
If (Trim(HidDev.ProductName) = ProductName_)
then If (HidDev.Attributes.VendorID = VendorID_) and
(HidDev.Attributes.ProductID = ProductID_)
then begin // устройство найдено
HidCtl.CheckOutByIndex(WorkDev, Idx); // получаем устройство по индексу
Label2.Caption:= 'подключено';
Result:= False; // поиск закончен
end
end;


procedure TForm1.HidCtlRemoval(HidDev: TJvHidDevice);
// Обработчик физического отключения устройства
// событие OnRemoval от HidCtl
begin
If HidDev = WorkDev then
begin // устройство было отключено
WorkDev:= nil;
Label2.Caption:= ' отключено'
end
end;


function TForm1.WorkDevSetFeature(Buf: TReportData): Boolean;
// Передача данных устройству WorkDev
begin
If Assigned(WorkDev)
then Result:= WorkDev.SetFeature(Buf, WorkDev.Caps.FeatureReportByteLength)
else Result:= False
end;


procedure TForm1.CheckBoxClick(Sender: TObject);
// Опрос состояний CheckBox и передача данных устройству
var
LEDs : Byte;
ReportData: TReportData;

begin
// Опрос состояний CheckBox
LEDs:= 0;
If CheckBox0.Checked then LEDs:= LEDs+1;
If CheckBox1.Checked then LEDs:= LEDs+2;
If CheckBox2.Checked then LEDs:= LEDs+4;
If CheckBox3.Checked then LEDs:= LEDs+8;
If CheckBox4.Checked then LEDs:= LEDs+16;
If CheckBox5.Checked then LEDs:= LEDs+32;
If CheckBox6.Checked then LEDs:= LEDs+64;
If CheckBox7.Checked then LEDs:= LEDs+128;

Label3.Caption:= 'LEDs = ' + IntToStr(LEDs);

// Передача данных устройству WorkDev
FillChar(ReportData, SizeOf(ReportData), 0); // заполняем массив нулями
ReportData[0]:= 0; // номер репорта
ReportData[1]:= LEDs; // данные репорта
If WorkDevSetFeature(ReportData) // пытаемся передать данные
then Label4.Caption:= ' Ok! '
else Label4.Caption:= ' Ошибка передачи данных '
end;

end.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
09.11.2012, 19:57
общий
Адресаты:
Добрый вечер. Не могу найти TJvHidDeviceController. Я так понимаю мне нужно пакет установить дополнительно, картинка в прикрепленном файле? При компиляции проекта выдает ошибку на строку "HidCtl: TJvHidDeviceController;"
Прикрепленные файлы:
66ab4a2bad947b2056f6c3badf03f37f.jpg
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
10.11.2012, 06:14
общий
10.11.2012, 06:21
Адресаты:
Судя по картинке, компоненты JVCL Вы установили традиционным способом, т.е. открыли пакет для своей версии Delphi из подкаталога packages и установили его?
У Вас какая версия Delphi?
Указанный Вами класс (TJvHidDeviceController) находится в модуле JvHidControllerClass. Посмотрите внимательно, он подключён в том модуле, где используется, в строке Uses? Какой именно текст ошибки выдаёт Вам компилятор?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
10.11.2012, 08:48
общий
Адресаты:
Картинка не моя, поставил потому что там показан невизуальный компонент HID. Пакет я не устанавливал для своей версии, а судя по всему нужно (и где его найти) . Просто скомпилировал JvHidControllerClass.pas и JvComponentBase.pas, и закинул полученные файлы в папку Delphi\Lib. Использую Delphi 7. Вот моя картинка, с текстом ошибки.
Прикрепленные файлы:
c0d2fe272e6dc3125a5b43e897a9b640.jpg
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
10.11.2012, 10:18
общий
10.11.2012, 10:20
Да, если Вы помещаете компонент на форму (или используете где-то взятую чужую форму с компонентом), тогда надо предварительно устанавливать пакет этих компонентов. Смотрите в подкаталоге packages файлы, которые начинаются на D7 - это Ваши пакеты. В меню Delphi нажимаете Component -> Install Component, далее, в открывшемся окне нажать кнопку Browse в строке с надписью "Package file name" и выбираете пакет, название которого начинается на D7. Потом нажимаете Ок и со всем соглашаетесь. После успешной компиляции, на панели компонентов должна появиться новая закладка с установленными компонентами.
Если компоненты устанавливать не хотите, то в файле, где Вы используете этот самый HID, нужно объявить его в разделе private Вашего класса формы и перед первым использованием его нужно создать и заполнить необходимые свойства. Естественно надо не забыть добавить в строку Uses модуль, где содержится этот компонент.
Для невизуальных компонентов я, обычно, выбираю второй способ.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
10.11.2012, 14:30
общий
Адресаты:
Закругляюсь с USB не получается ни чего. Хотел пакет установить, ошибку выдает. Отложим изучение USB. Благодарю за помощь.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
425
4118
11.11.2012, 18:33
общий
Адресаты:
Судя по Вашим сообщениям, стаж программирования в Delphi у Вас небольшой. Попробуйте сначала выбрать какой-нибудь несложный, но интересный для Вас проект, чтобы получить определённый опыт программирования и общения именно с языком Delphi. Когда Вы набъёте руку, любой сложный проект у Вас будет получаться. Не буду говорить, что без труда, но именно получаться. Трудности, если Вы наметили путь к их преодолению, только усиливают интерес. А сейчас Вы просто теряетесь в совершенно элементарных вещах. Желаю удачи.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
352040
133
11.11.2012, 19:55
общий
Адресаты:
Действительно, стаж не большой. Надеюсь потихоньку научимся. Благодарю за консультацию, и помощь.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Форма ответа