|
Не могу произвести запись в драйвер 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().
|
|
|
|
|
Sep 18 2008, 08:10
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(SergeiCh @ Sep 18 2008, 13:34)  Видимо, о том, который возвращает GetLastError(). А я думал, что это WriteFile возвращает такую ошибку!
|
|
|
|
|
Sep 18 2008, 08:36
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(Bulat @ Sep 18 2008, 15:10)  А я думал, что это WriteFile возвращает такую ошибку! WriteFile возвращает ноль (FALSE) или не ноль (TRUE). Причину, по которой был ноль, можно узнать по коду, который возвращает GetLastError. Рекомендую перед использованием глянуть описание в доках по Win32 API. Там же есть FormatMessage для перевода кода на человеческий язык
|
|
|
|
|
Sep 18 2008, 08:50
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(Bulat @ Sep 18 2008, 14:10)  А я думал, что это WriteFile возвращает такую ошибку! Так вот с помощью FormatMessage я это и получил!: Код //Запись в файл 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"; }
TCHAR szBuf[80]; LPVOID lpMsgBuf; DWORD dw = GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
text.Format("%s", lpMsgBuf); pDoc->StringData1 += text;//Тут у меня выводится сообщение "Параметр задан неверно" Поэтому у меня и возник вопрос:"О каком параметре идет речь?".
|
|
|
|
|
Sep 18 2008, 09:59
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Цитата(Bulat @ Sep 18 2008, 15:50)  Поэтому у меня и возник вопрос:"О каком параметре идет речь?". Значит, это тот случай, когда лучше узнать код (dw)  , чтобы посмотреть в winerror.h и доках. Меня смущает com_buf в вызове WriteFile. Сам я так не пробовал  , но думал, что должна быть ошибка, т.к. с формальной точки зрения com_buf уже как бы указатель, а &com_buf должно быть указателем на указатель. Сейчас проверил, ан нет - все равно остался указатель, т.е. com_buf эквивалентно &com_buf. Любопытно. Еще попробуйте спросить на каком-нибудь win-програмерском форуме.
|
|
|
|
|
Sep 22 2008, 07:51
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(Aurochs @ Sep 20 2008, 05:28)  Драйвер at6124 хитро скроен. Для него нужно открывать 2 устройства - отдельно для чтения и записи. Для получения имени устройства для записи нужно к уже полученному Вами имени дописать "\\PIPE00", а для чтения "\\PIPE01" После добавления к имени устройства "\\PIPE00" всеравно WriteFile возвращает ошибку, но уже друную: "Неверный дескриптор". Дескрипторы у atm6124 и atm6124ser разные?
|
|
|
|
|
Sep 22 2008, 11:19
|
Ортодокс
  
Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775

|
Цитата(Bulat @ Sep 22 2008, 10:51)  После добавления к имени устройства "\\PIPE00" всеравно WriteFile возвращает ошибку, но уже друную: "Неверный дескриптор". Дескрипторы у atm6124 и atm6124ser разные? Похоже, наши переводчики суют термин "дескриптор" во все места, где нет соответствующего русскоязычного термина  Поэтому непонятно, о каком дескрипторе речь. Скорее всего имеется в виду хендл открытого или созданного устройства, который возвращает ф-ция CreateFile. Эти хендлы могут быть разные даже от вызова к вызову. Что тут делать? 1. Попробовать изменить GUID. Для драйвера из пакета AT91-ISP я задаю его так: DEFINE_GUID( guidAtmel6124, 0xE6EF7DCD, 0x1795, 0x4A08, 0x9F, 0xBF, 0xAA, 0x78, 0x42, 0x3C, 0x26, 0xF0 );2. Попробовать убрать GENERIC_READ из вызова CreateFile3. Если первые 2 пункта не помогут, то сообщить код ошибки, который возвращает GetLastError после вызова WriteFile
|
|
|
|
|
Sep 23 2008, 02:48
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(Aurochs @ Sep 22 2008, 17:19)  Похоже, наши переводчики суют термин "дескриптор" во все места, где нет соответствующего русскоязычного термина  Поэтому непонятно, о каком дескрипторе речь. Скорее всего имеется в виду хендл открытого или созданного устройства, который возвращает ф-ция CreateFile. Эти хендлы могут быть разные даже от вызова к вызову. Что тут делать? 1. Попробовать изменить GUID. Для драйвера из пакета AT91-ISP я задаю его так: DEFINE_GUID( guidAtmel6124, 0xE6EF7DCD, 0x1795, 0x4A08, 0x9F, 0xBF, 0xAA, 0x78, 0x42, 0x3C, 0x26, 0xF0 );2. Попробовать убрать GENERIC_READ из вызова CreateFile3. Если первые 2 пункта не помогут, то сообщить код ошибки, который возвращает GetLastError после вызова WriteFile1. Я этот гуид и использую, только записываю по-другому, у меня VС++8: Код GUID Nguid = {0xe6ef7dcd, 0x1795, 0x4a08, { 0x9f, 0xbf, 0xaa, 0x78, 0x42, 0x3c, 0x26, 0xf0} }; GUID *guid = &Nguid; 2.Убрал GENERIC_READ из вызова CreateFile, всеравно пишет: Неверный дескриптор. В BasicUSB для открывания, записи и чтения используют свои функции: Код short Open(char *sDeviceName); // Open pipe short Close(); // Close pipe virtual short ReadPipe(LPVOID pBuffer, ULONG ulBufferSize); // Read data virtual short WritePipe(LPVOID pBuffer, ULONG ulBufferSize, ULONG *pBytesWritten); // Write data Может в этом дело?
|
|
|
|
|
Sep 23 2008, 05:15
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Да и еще вопрос!) Я похоже неправильно приписываю "\\PIPE00" к имени устройства? Код HANDLE port = CreateFile(DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
WriteFile("port\\PIPE00", &com_buf, 28, &nBytes, NULL); Не подскажете как это правильно сделать?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|