0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 37
|
||||||
1 | ||||||
Отправка строки байт PCI-e устройству с использованием CreateFile() и WriteFile()08.10.2014, 15:37. Показов 2526. Ответов 8
Метки нет (Все метки)
Собственно имеется PCI-e плата, драйвер разработчика для нее и программа позволяющая просматривать память (BAR'ы) платы. Можно ли нормально передать этой плате строку байт при помощи CreateFile() и WriteFile()?
Есть код:
Для начала - правильно ли я указал имя устройства "\\.\Device0"? В интернете я нашел только такой вариант для PCI устройств. Наша плата имеет адрес Bus 2, Device 0, но в системе есть еще сетевая карта с адресом Bus 4, Device 0, может информация уходит туда? И вообще - возможна ли такая передача, или я придумал полную хрень?
0
|
08.10.2014, 15:37 | |
Ответы с готовыми решениями:
8
CreateFile, WriteFile Функции CreateFile() и WriteFile() Createfile, readfile, writefile Функции Createfile Writefile |
Ушел с форума
|
||||||
08.10.2014, 16:25 | 2 | |||||
Сделайте проверку ошибок нормально.
Т.е. проверка, что CreateFile вернула не INVALID_HANDLE_VALUE, что WriteFile вернула ненулевое значение и т.д. Только так можно быть уверенным, что что-то куда-то записалось. Добавлено через 37 секунд Да, и правильно вот так, если уж на то пошло:
0
|
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 37
|
||||||
08.10.2014, 16:52 [ТС] | 3 | |||||
что-то вроде
WriteFile у меня возвращает количество переданных байт в виде переменной Written, просто в другом месте, она глобальная. Или это не то? Так у меня было изначально, но так WriteFile возвращала, что записано 0 байт. В нынешнем виде код заявлял, что он что-то куда-то записал, я и оставил как получилось.
0
|
Ушел с форума
|
||||||
08.10.2014, 20:58 | 4 | |||||
Я больше чем уверен, что при "\\.\Device0" ничего не куда не писалось и устройство вообще не было открыто.
1
|
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 37
|
|||||||||||
09.10.2014, 13:38 [ТС] | 5 | ||||||||||
Нет, куда-то все таки писалось) А конкретнее - создавался файл Device0 и туда писалось, так как в CreateFile был параметр CREATE_ALWAYS.
Я добавил обработку ошибок:
я так понимаю это код ошибки ERROR_FILE_NOT_FOUND, значит неправильно составлен handle? попробовал его изменить аналогично handl'у для COM портов, но все равно та же ошибка.
0
|
Ушел с форума
|
|
09.10.2014, 21:44 | 6 |
Это значит, что пути, который Вы указываете, не существует.
Имя устройство (точнее, имя символьной ссылки на него) может быть произвольным. Если у вас есть конкретный драйвер под конкретное устройство, к нему должна быть документация, где все описано. Без документации эти попытки почти обречены. Ну можно попробовать через Setup API (SetupDiGetClassDevs и далее) найти подключенное к ПК устройство и запросить символьную ссылку на него. И вот через эту ссылку уже можно его и открывать.
0
|
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 37
|
||||||
14.10.2014, 11:31 [ТС] | 7 | |||||
Пока получилось используя SetupDiGetClassDevs,SetupDiEnumDeviceInfo и SetupDiGetDeviceRegistryProperty получить список устройств подключенных через PCI, и среди них есть необходимая плата.
Можно ли использовать в качестве имени устройства информацию из диспетчера устройств? Код экземпляра устройства, код оборудования или совместимые коды? Добавлено через 1 час 10 минут UPD: в итоге, использовав в SetupDiGetDeviceRegistryProperty параметр SPDRP_HARDWAREID, что выдало список тех же самых кодов оборудования, что и в диспетчере устройств. Использовал в CreateFile() различные варианты кода моей платы, но они все выдают ошибку 53 (ERROR_BAD_NETPATH)
P.S. В исходниках драйвера и документации копался пока только поверхностно.
0
|
Ушел с форума
|
|
14.10.2014, 14:52 | 8 |
Сообщение было отмечено LamerOnLine как решение
Решение
Нет.
Для имени устройства система формирует символьную ссылку с уникальным и постоянным именем, получается она через SetupDiGetDeviceInterfaceDetail (поле SP_DEVICE_INTERFACE_DETAIL_DATA::DevicePath).
1
|
0 / 0 / 0
Регистрация: 23.01.2009
Сообщений: 37
|
|
15.10.2014, 15:45 [ТС] | 9 |
Через DevicePath я получил строку
\\\\?\\pci#ven_1204&dev_ec30&subsys_30101204&rev_00#4&13cc24e9&0d&00e6#{c29fbbae-0864-4d2c-9c69-4ddb10d175db} но если спользовать ее в качестве имени в CreateFile - он выдает 2ую ошибку (ERROR_FILE_NOT_FOUND) ) Это вообще то, что нужно? Эта строка нашлась по GUID устройства, тут есть и vendorID и deviceID и сам GUID и это все соответствует моей плате, но CreateFile() все равно не хочет ее находить... Добавлено через 53 минуты Ох, проблема решена. Просто я первоначальном варианте хотел записать имя как константу и в процессе переписывания опечатался. CreateFile() таки нашла мое устройство по данному имени, а WriteFile() возвращает значение переданных символов. Короче функция теперь работает как задумано, только вот на плате почему-то никаких изменений. Буду изучать документацию и исходники...
0
|
15.10.2014, 15:45 | |
15.10.2014, 15:45 | |
Помогаю со студенческими работами здесь
9
Функции win32 CreateFile WriteFile и ReadFile WriteFile как передать команду устройству Как работать с LPT портом через функции CreateFile, ReadFile, WriteFile? Работа с COM портами: сколько байт посылать устройству Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |