Sevenfly
Гость
|
|
« : 06-10-2006 13:06 » |
|
Возникла такая проблема: есть устройство на 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;
}
В чём может быть проблема?
|