|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Отправка данных по USB
Всем здравствуйте!!!
У меня задача такая:мне нужно написать программу на Delphi 7. Чтобы была кнопочка,при нажатии которой на контроллере STM32F407 защигался светодиод.Если кто-нидь сталкивался с этим,подскажите,пожалуйста,хоть в какую сторону копать.А если скинете код,буду очень благодарна!!! |
#2
|
||||
|
||||
Если USB как COM порт в системе виден - то достаточно просто.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
Цитата:
Последний раз редактировалось Kateee, 27.01.2013 в 21:36. |
#4
|
||||
|
||||
Если устройство 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; jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
Это ведь код обнаружения устройства..Я же не знаю,что послать по 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
|
||||
|
||||
Схема устройства есть?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
Kateee (28.01.2013)
|