Einzelnen Beitrag anzeigen

mynamenixname

Registriert seit: 16. Jan 2010
2 Beiträge
 
#1

Lernpaket: Experimente mit USB - FT232R USB UART

  Alt 16. Jan 2010, 12:40
Hallo,
ich versuche zurzeit aus dem Franzis Lernpaket "Experimente mit USB" die in Visual Basic geschriebenen Beispielprogramme in Delphi nachzubauen, um die entsprechenden Funktionen selber nutzen zu können.
Es ist mir bereits gelungen mit Hilfe der "D2XXUnit.pas" einen Port zu öffnen und einen Ausgang zu schalten. Nun möchte ich deinen Eingang abfragen, woran ich leider scheitere.
Die Anleitung des Lernpaketes sagt folgendes dazu:
Zitat:
Für das siebte Beispiel ist der Quellcode in der Datei BeispielVBP im Verzeichnis
Bsp_7 einsehbar. Die folgenden Routinen werden aufgerufen, wenn der Schalter
Signale abfragen zur Programmlaufzeit im VB-Formular betätigt wird.

Code:
Private Sub bt_Eingang_abfragen_Click()
.
.
IF FT_GetModemStatus(lngHandle, ModemStatus) <> FT_OK Then
LoggerList.AddItem "Fehler bei Aufruf: FT_GetModemStatus"
Else
Me.Cb_cts.Value = (ModemStatus And &H10) / &H10
Me.cb_dsr.Value = (ModemStatus And &H20) / &H20
Me.cb_ri.Value = (ModemStatus And &H40) / &H40
Me.Cb_dcd.Value = (ModemStatus And &H80) / &H80
End If
.
.
End Sub
Der Funktionsaufruf FT_GetModemStatus zeigt den Zustand der jeweiligen Signalleitungen
im zurückgegebenen Wert ModemStatus in einzelnen Bits an. Diese müssen
abgefragt und einzeln weiter verarbeitet werden:

DCD RI DSR CTS X X X X = Modemstatus, die letzten 8 Bits
D7 D6 D5 D4 D0 = Datenbits
0 0 0 1 0 0 0 0 = Maske: &H10 (= HEX10)

Als Beispiel schauen wir uns die Verarbeitung von CTS an. CTS wird im Datenbit
D4 angezeigt. Mit (ModemStatus And &H10) wird das Datenbit D4 im ModemStatus
mit dem Datenbit D4 in der Maske &H10 logisch mit UND (AND) verknüpft.
Bei einer UND-Verknüpfung müssen beide Bits einen Wert von 1 besitzen, damit
das Ergebnis eine 1, bzw. ungleich 0 ist. Ist CTS 0, bleibt das Ergebnis 0 und das
Kontrollkäschen Cb_cts ist deaktiviert.
CTS = 0:
0 = CTS = 0
0 0 0 1 0 0 0 0 =MaskeHEX10
0 0 0 0 0 0 0 0 = Ergebnis = 0

CTS = 1:
1 = CTS = 1
0 0 0 1 0 0 0 0 =MaskeHEX10
0 0 0 1 0 0 0 0 = Ergebnis = Hex 10, bzw. dezimal 16

Nur wenn CTS eine 1 besitzt, erhält man in diesem Fall ein Ergebnis von 1. Das
Ergebnis aus (ModemStatus And &H10) würde in diesem Fall die Zahl 16
(= Hex10) sein. Damit das Ergebnis gleich alsWert 1 beim Kontrollkästchen Cb_cts
verwendet werden kann, muss noch durch die Maske &H10 geteilt werden.
Die weiteren Signale DCD, RI und DSR werden entsprechend der Position des Bits
im ModemStatus mit &H80, &H40 und &H20 maskiert.
Um den Eingang nun mit Delphi abzufragen habe ich in der "D2XXUnit.pas" nach FT_GetModemStatus gesucht und folgende Funktion gefunden:
function FT_GetModemStatus(ftHandle:Dword; ModemStatus:Pointer):FT_Result; stdcall; External FT_DLL_Name name 'FT_GetModemStatus';
Delphi-Quellcode:
Function Get_USB_Device_ModemStatus : FT_Result;
Begin
Result := FT_GetModemStatus(FT_Handle,@FT_Modem_Status);
If Result <> FT_OK then FT_Error_Report('FT_GetModemStatus',Result);
End;
Leider bekomme ich es einfach nicht hin diese Funktion zu nutzen.
Führe ich sie einfach aus, ergibt sie, egal ob es einen Signal gibt oder nicht, 0.

Wie kann ich die Funktion sinnvoll nutzen?

Vielen Dank für eure Mühe
mynamenixname
  Mit Zitat antworten Zitat