unclejamal
10.04.2006, 14:42
hallo
ich benutze einen atmel µC (atmel) der über ein USB-Modul (DLP-USB245 mit FTDI FT245 chip) mit dem PC verbunden ist. das senden und empfangen von daten (zahlen) funzt in beiden richtungen.
ich möchte folgende synchronisation mit dem µController, der auf dem USB-Modul hängt, vornehmen:
µC -> PC "Request"..... PC->µC "Reply" (Request und Reply sind natürlich vordefinierte fixe werte)
wenn der µC 5mal eine Antwort vom PC bekommt sendet er einmalig noch eine Bestätigung.
Das Problem: die Fuktion ReadFTDI() liefert mir nichts zurück. wie kann ich aber meine Synchronisation machen. muss ich einen rückgabetyp wählen, wenn ja, welcher?
mit der folgendne funktion, hätte ich mir die synchronisation überlegt, allerdings ist es dann an obiger frage gescheitert:
meine funktion zu ReadFTDI() ist void:
void TFormMain::ReadFTDI (void)
{
FT_STATUS ftStatus;
DWORD EventDWord;
DWORD RxBytes;
DWORD TxBytes;
DWORD BytesReceived;
unsigned char RxBuffer[256];
int iIndex;
int iX;
RxBytes=0;
TxBytes=0;
BytesReceived=0;
EventDWord=0;
for(iIndex=0; iIndex<=256; iIndex++)
{
RxBuffer[iIndex]=0;
}
FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
//FT_SetTimeouts(ftHandle,5000,0);
if(RxBytes > 0)
{
ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);
if(ftStatus == FT_OK)
{
if(BytesReceived == RxBytes)
{
for(iX = 0 ; iX < int(BytesReceived) ; iX++)
{
Memo->Lines->Add("RxBuffer[iX] = RxBuffer[" + IntToStr(iX) + "]:");
Memo->Lines->Add(RxBuffer[iX]);
}
}
else
{
//no value was written on the bus
}
}
else
{
//can not read FTDI chip
}
}
bool TFormMain::SyncUSB (void)
{
int iReceive; // erhaltene Zahl von uC
int iSuccess=0; // wie oft wurde REQUEST empfangen
bool bSync; // ganze Sync OK (wenn iSuccess=5);
iReceive = ReadFTDI(); // <--- ***** FEHLERMELDUNG ********
while (iReceive == 5)
{
if (iReceive == 245)
{
iSuccess++;
Memo->Lines->Add("uC Request: " + IntToStr(iSuccess) + "x mal erhalten");
WriteFTDI(246); // Reply
Memo->Lines->Add("Reply an uC gesendet");
}
else
{
Memo->Lines->Add("uC Request nicht erhalten");
}
}
return bSync; // Rückgabe des Status ob Sync erfolgreich oder nicht
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ButtonSyncStartClick(TObject *Sender) //Button zur synchronisation
{
MemoDebug->Lines->Add("--- SyncUSB gestartet ---");
if(SyncUSB() == 1) Memo->Lines->Add("Sync OK !!!");
else Memo->Lines->Add("Sync fehlgeschlagen!");
}
//---------------------------------------------------------------------------
hoffe das hier ist halbwegs übesichtlich. wenn möglich bitte die änderung und vorschläge am source code anwenden!
danke
uj
ich benutze einen atmel µC (atmel) der über ein USB-Modul (DLP-USB245 mit FTDI FT245 chip) mit dem PC verbunden ist. das senden und empfangen von daten (zahlen) funzt in beiden richtungen.
ich möchte folgende synchronisation mit dem µController, der auf dem USB-Modul hängt, vornehmen:
µC -> PC "Request"..... PC->µC "Reply" (Request und Reply sind natürlich vordefinierte fixe werte)
wenn der µC 5mal eine Antwort vom PC bekommt sendet er einmalig noch eine Bestätigung.
Das Problem: die Fuktion ReadFTDI() liefert mir nichts zurück. wie kann ich aber meine Synchronisation machen. muss ich einen rückgabetyp wählen, wenn ja, welcher?
mit der folgendne funktion, hätte ich mir die synchronisation überlegt, allerdings ist es dann an obiger frage gescheitert:
meine funktion zu ReadFTDI() ist void:
void TFormMain::ReadFTDI (void)
{
FT_STATUS ftStatus;
DWORD EventDWord;
DWORD RxBytes;
DWORD TxBytes;
DWORD BytesReceived;
unsigned char RxBuffer[256];
int iIndex;
int iX;
RxBytes=0;
TxBytes=0;
BytesReceived=0;
EventDWord=0;
for(iIndex=0; iIndex<=256; iIndex++)
{
RxBuffer[iIndex]=0;
}
FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
//FT_SetTimeouts(ftHandle,5000,0);
if(RxBytes > 0)
{
ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);
if(ftStatus == FT_OK)
{
if(BytesReceived == RxBytes)
{
for(iX = 0 ; iX < int(BytesReceived) ; iX++)
{
Memo->Lines->Add("RxBuffer[iX] = RxBuffer[" + IntToStr(iX) + "]:");
Memo->Lines->Add(RxBuffer[iX]);
}
}
else
{
//no value was written on the bus
}
}
else
{
//can not read FTDI chip
}
}
bool TFormMain::SyncUSB (void)
{
int iReceive; // erhaltene Zahl von uC
int iSuccess=0; // wie oft wurde REQUEST empfangen
bool bSync; // ganze Sync OK (wenn iSuccess=5);
iReceive = ReadFTDI(); // <--- ***** FEHLERMELDUNG ********
while (iReceive == 5)
{
if (iReceive == 245)
{
iSuccess++;
Memo->Lines->Add("uC Request: " + IntToStr(iSuccess) + "x mal erhalten");
WriteFTDI(246); // Reply
Memo->Lines->Add("Reply an uC gesendet");
}
else
{
Memo->Lines->Add("uC Request nicht erhalten");
}
}
return bSync; // Rückgabe des Status ob Sync erfolgreich oder nicht
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::ButtonSyncStartClick(TObject *Sender) //Button zur synchronisation
{
MemoDebug->Lines->Add("--- SyncUSB gestartet ---");
if(SyncUSB() == 1) Memo->Lines->Add("Sync OK !!!");
else Memo->Lines->Add("Sync fehlgeschlagen!");
}
//---------------------------------------------------------------------------
hoffe das hier ist halbwegs übesichtlich. wenn möglich bitte die änderung und vorschläge am source code anwenden!
danke
uj