Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с искажением данных на USB  (Прочитано 4296 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sevenfly
Гость
« : 06-10-2006 13:06 » new

Возникла такая проблема: есть устройство на AT89C5131, написана прошивка и как казалось драйвер. Передаю данные устройству - массив 32 байта, заполненный "1" в аски коде (т.е. цифрами 49)

Шлю штук 20 таких массивов, смотрю что принимается. Почему-то иногда искажаются принимаемы данные, причем на одни и те же цифры 188,69. И в разных местах. Драйвер написан с помощью Driver Studio, вот процедура записи в устройство:

NTSTATUS CandDV2Device::CANDDV2_IOCTL_804_Handler(KIrp I)
{

DbgPrint("CandDDriverDevice::Write START");

NTSTATUS status = STATUS_SUCCESS;


PUCHAR pBuffer = (PUCHAR)I.IoctlBuffer();

ULONG dwTotalSize = I.IoctlInputBufferSize(CURRENT);
ULONG dwBytesSent = 0;


ULONG dwMaxSize = m_Endpoint4OUT.MaximumTransferSize();
DbgPrint("CandDV2Device::CANDDV2_IOCTL_804_Handler (write to EP4) START");

DbgPrint(" Write: Requested=%d, MaxSize=%d", dwTotalSize, dwMaxSize);

if(dwTotalSize==0)
{
return status;
}

if (dwTotalSize > dwMaxSize)
{
dwTotalSize = dwMaxSize;
}


DbgPrint("Endpoint 4");

for (int i=0; i<(int)dwTotalSize; i++)
DbgPrint("write buffer: %d", ((PCHAR)(pBuffer)) );

PURB pUrb = m_Endpoint4OUT.BuildBulkTransfer(
pBuffer, // Where is data coming from?
dwTotalSize, // How much data to write?
FALSE // Short OK
);

if (pUrb == NULL)
{
I.Information() = 0;
DbgPrint("ERROR: BuildInterrupt");
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}

// Submit the URB to our USB device, synchronously - say less is OK
pUrb->UrbBulkOrInterruptTransfer.TransferFlags =
(USBD_TRANSFER_DIRECTION_OUT);

if (!m_Endpoint4OUT.IsOpen())
{
I.Information() = 0;
DbgPrint("ERROR: m_Endpoint4OUT is not open!");
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}

status = m_Endpoint4OUT.SubmitUrb(pUrb);

dwBytesSent = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;


delete pUrb;

I.Information() = dwBytesSent;

DbgPrint("CandDV2Device::CANDDV2_IOCTL_804_Handler END");
return status;

}

В чём может быть проблема?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines