Возникла такая проблема: есть устройство на 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))[i] );
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;
}
В чём может быть проблема?