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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.01.2013, 16:29
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию Отправка данных по USB

Всем здравствуйте!!!
У меня задача такая:мне нужно написать программу на Delphi 7. Чтобы была кнопочка,при нажатии которой на контроллере STM32F407 защигался светодиод.Если кто-нидь сталкивался с этим,подскажите,пожалуйста,хоть в какую сторону копать.А если скинете код,буду очень благодарна!!!
Ответить с цитированием
  #2  
Старый 27.01.2013, 18:46
Аватар для 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
Репутация: выкл
По умолчанию

Если USB как COM порт в системе виден - то достаточно просто.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 27.01.2013, 21:34
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Если USB как COM порт в системе виден - то достаточно просто.
Хмм...и как же,если не секрет?Я просто новичок в этом.впервые стакиваюсь с контроллером(

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

Если устройство HID - то как-то так:
Код:
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;
end;
Ну а потом чтение/запись стандартным ReadFile/WriteFile.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 28.01.2013, 16:43
Kateee Kateee вне форума
Прохожий
 
Регистрация: 27.01.2013
Сообщения: 9
Репутация: 10
По умолчанию

Это ведь код обнаружения устройства..Я же не знаю,что послать по USB в контроллер,чтобы загорелся светодиод.Я нашла вот такое -
пример из программы, которая передает в МК 16 управляющих байт,
Код:
procedure TForm1.cmdWriteClick(Sender: TObject);
var
 i : integer;
 Buf: array [0..16] of Byte;
 Written: Cardinal;
 ToWrite: Cardinal;
begin
//Проверяем подключено ли наше устройство if Assigned(CurrentDevice) then begin //Узнаем какова длина OUTPUT репорта, котрым владеет МК ToWrite := CurrentDevice.Caps.OutputReportByteLength;
//Заполняем буфер нужными нам параметрами. Необходимо отметить, что самым первым //значением в буфере стоит номер репорта. В нашем случае это 0!
 Buf[0] := 0;
 Buf[1] := Rx;
 Buf[2] := Gx;
 Buf[3] := Yx;
 Buf[4] := Bx;
 Buf[5] := Rf;
 Buf[6] := Gf;
 Buf[7] := Yf;
 Buf[8] := Bf;
 Buf[9] := Regim;
 Buf[10] := Zmax;
 Buf[11] := Zmin;
 Buf[12] := Tim;
 Buf[13] := HiZat;
 Buf[14] := LoZat;
 Buf[15] := HiZatF;
 Buf[16] := LoZatF;
//Все скопом сбрасываем в контроллер. В переменной Written будет количество //переданных байт
 CurrentDevice.WriteFile(Buf, ToWrite, Written);
 end;
end;
Админ: Пользуемся тегами!

откуда взять эти параметры,которые записываются в буфер?Если есть возможность,то хотя бы приведите,пожалуйста,пример на каком-нидь другом контроллере,чтоб я понимала что и откуда берется(

Последний раз редактировалось Admin, 28.01.2013 в 20:36.
Ответить с цитированием
  #6  
Старый 28.01.2013, 17:23
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Схема устройства есть?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
Kateee (28.01.2013)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter