|
Не могу произвести запись в драйвер atm6124.sys из BasicUSB, at91sam7s. |
|
|
|
Sep 17 2008, 03:46
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Прошивка контролера на основе BasicUSB, с драйвером atm6124ser работает все нормально, но мне не хватает скорости. Пытаюсь открыть драйвер atm6124.sys, CreateFile выполняется нормально, но далее при попытке произвести запись WriteFile возвращает ошибку! Так я открываю драйвер в VC++ 8: Код HDEVINFO hDevInfo; // {A5DCBF10-6530-11D2-901F-00C04FB951ED} GUID Nguid = { 0xA5DCBF10, 0x6530, 0x11d2, { 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed } }; GUID *guid = &Nguid; hDevInfo = SetupDiGetClassDevs (guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); /*Мы попросили вернуть нам описатель для устройств, предоставляющих интерфейс с guid и присутствующих в данный момент в системе получаем краткую информацию для интерфейсов (в данном случае, для первого интерфейса в списке с подходящим guid)*/
PSP_DEVICE_INTERFACE_DATA devInfoData = (PSP_DEVICE_INTERFACE_DATA)malloc(sizeof(SP_DEVICE_INTERFACE_DATA)); devInfoData->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); SetupDiEnumDeviceInterfaces(hDevInfo, NULL, guid, 0, devInfoData); //Определим необходимую для хранения символического имени устройства длину буфера unsigned long requiredlength; SetupDiGetDeviceInterfaceDetail(hDevInfo, devInfoData, NULL, 0, &requiredlength, NULL);
//Узнаем символическое имя для устройства с заданным интерфейсом PSP_DEVICE_INTERFACE_DETAIL_DATA DevInfoDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredlength); DevInfoDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); SetupDiGetInterfaceDeviceDetail (hDevInfo, devInfoData, DevInfoDetail, requiredlength, &requiredlength, NULL); //открытие порта HANDLE port = CreateFile(DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //проверка результата открытия порта if (port == INVALID_HANDLE_VALUE) {pDoc->StringData1 = "failed opening";} else {pDoc->StringData1 = "cool opening";}
BOOLEAN Success; unsigned char com_buf[28];//буфер ком. слов и слова режима //заполнение буфера com_buf com_buf[0]=0x30; //команда для командного процессора девайса: запрос подтверждения приема данных com_buf[1]=mTMode[0]; com_buf[2]=mTMode[1]; for(int i=3;i<27;i++) { com_buf[i]=mCWord[i-3]; } com_buf[27]=0x0; //Запись в файл ULONG nBytes=28; Success = WriteFile(port, &com_buf, 28, &nBytes, NULL);//Запись слова режима, ком. слова //ожидание окончания записи в файл if(!Success ) //|| ( nBytes != sizeof(VENDORPACKET) ) ) { pDoc->StringData1 += " failed to write"; } else { pDoc->StringData1 += " write successful"; } Код возвращат " failed to write". Кто-нибудь сталкивался с такой проблемой?
|
|
|
|
|
 |
Ответов
|
Sep 17 2008, 04:53
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(prottoss @ Sep 17 2008, 10:02)  какую конкретно ошибку возвращает WriteFile? Если FILE_IO_PENDING (точное название не помню), то ничего страшного. Нужно просто дождаться конца операции записи. Читайте WinAPI32. Я не уверен. У Bulat открытие проиcходит без перекрытия, т.е. предполагаются синхронные операции с файлом. Для открытие асинихронных операций нужно указывать флаг -- FILE_FLAG_OVERLAPPED. А в тексте проги стоит FILE_ATTRIBUTE_NORMAL. Поэтому операции с хендлом будут синхронные, значит функция WriteFile не вернет управление до тех пор, пока не закончит запись. При асинхронных операциях WriteFile не дожидаясь окончания записи, действительно, возвращает управление с кодом возврата ERROR_IO_PENDING, что говорит -- "все ОК, процесс пошел. Результат будет чуть позже, а Вы пока займитесь еще чем-нибудь."
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Sep 18 2008, 07:24
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(prottoss @ Sep 17 2008, 11:19)  . Возможно. 2 Bulat - какой код ошибки возвращает WriteFile? WriteFile выдает следующую ошибку: "Параметр задан неверно". И далее 2 знака похожие на "Ъ". О каком параметре идет речь?
|
|
|
|
|
Sep 18 2008, 07:34
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(Bulat @ Sep 18 2008, 14:24)  О каком параметре идет речь? Видимо, о том, который возвращает GetLastError().
|
|
|
|
Сообщений в этой теме
Bulat Не могу произвести запись в драйвер atm6124.sys из BasicUSB Sep 17 2008, 03:46     Bulat Цитата(SergeiCh @ Sep 18 2008, 13:34) Вид... Sep 18 2008, 08:10      SergeiCh Цитата(Bulat @ Sep 18 2008, 15:10) А я ду... Sep 18 2008, 08:36      Bulat Цитата(Bulat @ Sep 18 2008, 14:10) А я ду... Sep 18 2008, 08:50       SergeiCh Цитата(Bulat @ Sep 18 2008, 15:50) Поэтом... Sep 18 2008, 09:59 Aurochs Драйвер at6124 хитро скроен.
Для него нужно открыв... Sep 19 2008, 23:28 Bulat Цитата(Aurochs @ Sep 20 2008, 05:28) Драй... Sep 22 2008, 07:51  Aurochs Цитата(Bulat @ Sep 22 2008, 10:51) После ... Sep 22 2008, 11:19   Bulat Цитата(Aurochs @ Sep 22 2008, 17:19) Похо... Sep 23 2008, 02:48    Bulat Да и еще вопрос!) Я похоже неправильно приписы... Sep 23 2008, 05:15     Aurochs Цитата(Bulat @ Sep 23 2008, 08:15) Да и е... Sep 23 2008, 07:21      Bulat Цитата(Aurochs @ Sep 23 2008, 13:21) Ну, ... Sep 23 2008, 17:01       Bulat Извиняюсь, что опять поднял тему, но у меня пробле... Sep 24 2008, 17:27        Aurochs Цитата(Bulat @ Sep 24 2008, 20:27) Так во... Sep 24 2008, 21:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|