реклама на сайте
подробности

 
 
> Таймаут ReadFile из USB-устройства на не-INTEL чипсетах
prottoss
сообщение May 13 2011, 15:55
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Привет всем.

Есть устройство выполненное на AT91SAM7S - подробнее на http://prottoss.com/projects/ucGoZilla/ucGoZilla.htm.
Для РС обозначено как СОМ-порт.
Из драйверов только INF-файл, указывающий на штатный для Windows драйвер usbser.sys

Проблема в том что, при работе с внутренним загрузчиком SAM-BA, на некоторых материнских платах, с не-INTEL чипсетами обмен между ПО на РС и устройством может прерываться.
Т.е. первый запрос в устройство через WriteFile проходит (2 байта), далее чтение через ReadFile (2 байта) тоже отлично.
Далее новый запрос. Но функция ReadFile вылетает по таймауту.

Т.е. в микроконтроллере инициализирован штатный внутренний загрузчик и я пытаюсь через самописную утилиту с ним связаться.

Утилита работает с устройством не как с СОМ-портом, а как с USB устройством.
Т.е через "SetupDiEnumDeviceInterfaces" находится устройство с нужным VID/PID затем извлекается хэндл и, далее, уже стандартно, открывается через CreateFile. Далее все как обычно - ReadFile/WriteFile

Ниже функции ввода-вывода

CODE

/*******************************************************************************
Write data to device
*******************************************************************************/
IO_RES WriteData(PVOID Data, ULONG Size)
{
OVERLAPPED sync = {0,};
ULONG xfer, err;
IO_RES res = RES_OK;

/* Create event */
sync.hEvent = CreateEvent(0, FALSE, FALSE, NULL);
if(sync.hEvent == NULL)
return WR_FAIL_CREATE_SYNC;

/* Write data */
if(!WriteFile(g_hWritePipe, Data, Size, &xfer, &sync))
{
/* Check error */
err = GetLastError();
if(ERROR_IO_PENDING == err)
{
/* Pending write operation */
err = WaitForSingleObject(sync.hEvent, CFG_IO_TIMEOUT);
switch(err)
{
case WAIT_OBJECT_0:
if(!GetOverlappedResult(g_hWritePipe, &sync, &xfer, TRUE))
return WR_FAIL_GET_OVERLAPPED_RESULT;
break;
case WAIT_TIMEOUT:
CancelIo(g_hWritePipe); /* Cancelled IO operation */
ResetEvent(sync.hEvent);
res = WRITE_TIMEOUT;
break;
case WAIT_ABANDONED:
default:
res = WR_FAIL_WAIT_FOR_SINGLE_OBJECT;
}
}
else
res = WR_FAIL_WRITE_OPERATION;
}
ResetEvent(sync.hEvent);
CloseHandle(sync.hEvent);
return res;
}

/*******************************************************************************
Read data from device
*******************************************************************************/
IO_RES ReadData(PVOID Data, ULONG Size)
{
OVERLAPPED sync = {0,};
ULONG xfer, err;
IO_RES res = RES_OK;

/* Create event */
sync.hEvent = CreateEvent(0, TRUE, FALSE, NULL);
if(sync.hEvent == NULL)
return RD_FAIL_CREATE_SYNC;

/* Read data */
if(!ReadFile(g_hWritePipe, Data, Size, &xfer, &sync))
{
/* Check error */
err = GetLastError();
if(ERROR_IO_PENDING == err)
{
/* Set pending operation */
err = WaitForSingleObject(sync.hEvent, CFG_IO_TIMEOUT);
switch(err)
{
case WAIT_OBJECT_0: /* Wait read operation complete */
if(!GetOverlappedResult(g_hWritePipe, &sync, &xfer, TRUE))
res = RD_FAIL_GET_OVERLAPPED_RESULT;
break;
case WAIT_TIMEOUT:
CancelIo(g_hWritePipe); /* Cancelled IO operation */
ResetEvent(sync.hEvent);
res = READ_TIMEOUT;
break;
case WAIT_ABANDONED:
default:
res = RD_FAIL_WAIT_FOR_SINGLE_OBJECT;
}
}
else
res = RD_FAIL_WRITE_OPERATION;
}

CloseHandle(sync.hEvent);
return res;
}


--------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 10:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016