За образец взял примеры из CyApI, использую поток thread с Bulk (стандартный Bulkloop.hex) передачами:
Код
: //---------------------------------------------------------------------------
//--------------------------Write-and-Read-----------------------------------
//---------------------------------------------------------------------------
class WriteAndReadThread : public TThread
{
private:
void __fastcall Printing(); //âûâîä
protected:
void __fastcall Execute(); //îñíîâíàÿ ôóíêöèÿ ïîòîêà
public:
__fastcall WriteAndReadThread(bool CreateSuspended); //êîíñòðóêòîð ïîòîêà
};
//---------------------------------------------------------------------------
WriteAndReadThread *writereader;
//---------------------------------------------------------------------------
__fastcall WriteAndReadThread::WriteAndReadThread(bool CreateSuspended) : TThread(CreateSuspended)
{}
//---------------------------------------------------------------------------
void __fastcall WriteAndReadThread::Execute()
{
bmap = new Graphics::TBitmap; // ñíà÷àëà ðèñóåì íà bitmap, ïîòîì âûâîäèì íà ôîðìó
bmap->Width = Form1->Image1->Width;
bmap->Height = Form1->Image1->Height;
AnsiString stryng = Form1->Edit1->Text.c_str();
outBuf=new char[stryng.Length()+1];//length âîçâðàùàåò äëèííó áåç íóëü-òåðìèíàòîðà,ïîýòîìó +1
strcpy(outBuf,stryng.c_str());
length = stryng.Length()+1;
while(!Terminated)
{
outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT");
UCHAR *outContext;
outContext = USBDevice->BulkOutEndPt->BeginDataXfer(outBuf, length, &outOvLap);
USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);
succesOut = USBDevice->BulkOutEndPt->FinishDataXfer(outBuf, length, &outOvLap,outContext);
if(!succesOut) //Åñëè ïðèåì èëè ïåðåäà÷à ñ îøèáêîé ïðîèçîøëè
{
writereader->Terminate();
if(drawer)drawer->Terminate();
Form1->SpeedButton1->Caption = "Begin transfer";
Form1->SpeedButton1->Down = false;
Form1->Memo1->Lines->Add("Sending error!");
}
CloseHandle(outOvLap.hEvent);
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap);
USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
succesIn = USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);
if(!succesIn) //Åñëè ïðèåì èëè ïåðåäà÷à ñ îøèáêîé ïðîèçîøëè
{
writereader->Terminate();
if(drawer)drawer->Terminate();
Form1->SpeedButton1->Caption = "Begin transfer";
Form1->SpeedButton1->Down = false;
Form1->Memo1->Lines->Add("Recieving error!");
}
Synchronize(Printing);
CloseHandle(inOvLap.hEvent);
}
}
//---------------------------------------------------------------------------
void __fastcall WriteAndReadThread::Printing()
{
counter+=strlen(inBuf);
Form1->Label2->Caption = counter;
Form1->Memo2->Lines->Add(AnsiString((char *)inBuf));
for (unsigned int i = 0; i < strlen(inBuf); i++)
{
xpic++;
if (xpic >= Form1->Image1->Picture->Width)
{
ypic++;
xpic = 0;
}
if (ypic >= Form1->Image1->Picture->Height)
{
ypic = 0;
Form1->Image1->Canvas->Draw(0,0,bmap);
tempCol = tempCol - 16;
if (tempCol<0) tempCol = 255;
}
bmap->Canvas->Pixels[xpic][ypic]=TColor(RGB(tempCol,tempCol,tempCol));
}
ZeroMemory(inBuf, 512);
}
//---------------------------------------------------------------------------
//--------------------------Write-and-Read-----------------------------------
//---------------------------------------------------------------------------
class WriteAndReadThread : public TThread
{
private:
void __fastcall Printing(); //âûâîä
protected:
void __fastcall Execute(); //îñíîâíàÿ ôóíêöèÿ ïîòîêà
public:
__fastcall WriteAndReadThread(bool CreateSuspended); //êîíñòðóêòîð ïîòîêà
};
//---------------------------------------------------------------------------
WriteAndReadThread *writereader;
//---------------------------------------------------------------------------
__fastcall WriteAndReadThread::WriteAndReadThread(bool CreateSuspended) : TThread(CreateSuspended)
{}
//---------------------------------------------------------------------------
void __fastcall WriteAndReadThread::Execute()
{
bmap = new Graphics::TBitmap; // ñíà÷àëà ðèñóåì íà bitmap, ïîòîì âûâîäèì íà ôîðìó
bmap->Width = Form1->Image1->Width;
bmap->Height = Form1->Image1->Height;
AnsiString stryng = Form1->Edit1->Text.c_str();
outBuf=new char[stryng.Length()+1];//length âîçâðàùàåò äëèííó áåç íóëü-òåðìèíàòîðà,ïîýòîìó +1
strcpy(outBuf,stryng.c_str());
length = stryng.Length()+1;
while(!Terminated)
{
outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT");
UCHAR *outContext;
outContext = USBDevice->BulkOutEndPt->BeginDataXfer(outBuf, length, &outOvLap);
USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);
succesOut = USBDevice->BulkOutEndPt->FinishDataXfer(outBuf, length, &outOvLap,outContext);
if(!succesOut) //Åñëè ïðèåì èëè ïåðåäà÷à ñ îøèáêîé ïðîèçîøëè
{
writereader->Terminate();
if(drawer)drawer->Terminate();
Form1->SpeedButton1->Caption = "Begin transfer";
Form1->SpeedButton1->Down = false;
Form1->Memo1->Lines->Add("Sending error!");
}
CloseHandle(outOvLap.hEvent);
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap);
USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
succesIn = USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);
if(!succesIn) //Åñëè ïðèåì èëè ïåðåäà÷à ñ îøèáêîé ïðîèçîøëè
{
writereader->Terminate();
if(drawer)drawer->Terminate();
Form1->SpeedButton1->Caption = "Begin transfer";
Form1->SpeedButton1->Down = false;
Form1->Memo1->Lines->Add("Recieving error!");
}
Synchronize(Printing);
CloseHandle(inOvLap.hEvent);
}
}
//---------------------------------------------------------------------------
void __fastcall WriteAndReadThread::Printing()
{
counter+=strlen(inBuf);
Form1->Label2->Caption = counter;
Form1->Memo2->Lines->Add(AnsiString((char *)inBuf));
for (unsigned int i = 0; i < strlen(inBuf); i++)
{
xpic++;
if (xpic >= Form1->Image1->Picture->Width)
{
ypic++;
xpic = 0;
}
if (ypic >= Form1->Image1->Picture->Height)
{
ypic = 0;
Form1->Image1->Canvas->Draw(0,0,bmap);
tempCol = tempCol - 16;
if (tempCol<0) tempCol = 255;
}
bmap->Canvas->Pixels[xpic][ypic]=TColor(RGB(tempCol,tempCol,tempCol));
}
ZeroMemory(inBuf, 512);
}
//---------------------------------------------------------------------------
Поток запускается и прекращается по нажатию кнопки.
Скорость с которой передаются и принимаются данные около 1 Мбит/с.
Каким образом можно её увеличить?