LAZ 7. TXD und RXD mit FTDI, Luxus pur

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Serielle Kommunikation mit einer speziellen Komponente für Lazarus, welche im Zusammenspiel mit FTDI 232rl Bausteinen funktioniert.
    Der Vorteil des Einsatzes der FTDI Komponente ist, dass diese das angeschlossene Gerät automatisch verbinden kann.
    Dies kann auf zwei Arten geschehen:
    a) DeviceDescriptor
    Jeder FTDI Baustein hat eine "Beschreibung" in Textform in seinem Speicher. Diese kann über ein Tool von FTDI auch geändert werden (ftprog, Download bei FTDI)
    Wird ein FTDI Chip über USB verbunden, dessen DeviceDescriptor der in der FTDI hinterlegten Kennung entspricht, verbindet sich die Komponente automatisch.
    Bei Auslieferung ist diese Kennung "FT232R USB UART"
    Entwickelt man eine spezielle Hardware, kann man diese Kennung im FT232 Chip ändern und diese Hardware wir immer sicher erkannt.

    b) Die angeschlossene Hardware antwortet auf einen ConnectString
    Wird ein neues Gerät an den USB Bus angeschlossen, sendet die FTDI Komponente einen ConnectString (ConnectSendString)
    Das angeschlossene Gerät muss dann mit einem ReplyString (ConnectReplyString) antworten, damit es verbunden wird.

    Über eine dieser zwei Möglichkeiten kann man zweifelsfrei seine angeschlossene Hardware erkennen und verbinden lassen.
    Wir werden jetzt Schritt für Schritt ein solches System entwickeln.

    Voraussetzung dafür ist:
    ein USB/seriell Kabel mit FTDI Chip oder eine Hardware mit FT232rl Chip on Board.

    Arbeitet ihr unter Linux, dann ist der folgende Hinweis sehr wichtig:
    Der Linux Kernel bindet ein angeschlossenes FTDI Gerät sofort automatisch in das System ein. Das kann gut sein, ist in unserem Fall aber nicht gut.
    Wir haben ja unseren eigenen Treiber (libftd2xx.so.1.3.6 in /user/lib) und möchten selbst Kontrolle über den Chip erlangen. Also müssen wir Linux mitteilen, unser Gerät gefälligst in Ruhe zu lassen.
    Dies geht recht einfach, indem wir eine Regel in /etc/udev/rules.d/ mit Namen 98-ftdi.rules erstellen.
    Hier der Inhalt dieser Datei. Falls ihr über ftprog den Bezeichner geändert habt, dann muss anstatt "FT232R USB UART" euer neuer Name eingetragen werden! Es ist natürlich auch möglich, weitere Zeilen mit differenten Namen und/oder Vendor/Produkt Kennungen einzufügen.

    Quellcode

    1. ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{product}=="FT232R USB UART", RUN+="/bin/sh -c 'echo $kernel > /sys/bus/usb/drivers/ftdi_sio/unbind'"




    Genug Vorspiel, starten wir ein neues Projekt unter Lazarus (Projekt, Neu, Anwendung, OK)
    Platziere ein TFTDI, TShape, TButton, TEDit und TMEmo auf der Form (Form1)

    Im Objektinspektor ändern wir:
    Shape1.Shape --> stCircle
    Edit1.text --> alles rauslöschen
    Memo1.lines --> alles rauslöschen
    Button1.caption --> "Sende"
    Form1.caption --> "COM Test"


    Die Positionen und Größen etwas anpassen, dann sollte das so aussehen


    Jetzt im Obejktinspektor "Form1" auswählen, dann "Ereignisse" anklicken


    Suche nun das Ereignis "onCreate" und klicke doppelt rein. Lazarus erstellt nun die Procedure für Form1.onCreate
    Dieses Ereignis tritt auf, wenn unser Fenster "Form1" gestartet/erzeugt wird.
    In diesem Ereignis können wir grundsätzliche Dinge regeln beim Start unseres Programms, wie z.B. die Ausgangsfarbe des TShape festlegen.
    Shape1 soll uns später signalisieren, ob unser USB Gerät verbunden ist. Beim Start gehen wir erst einmal davon aus, dass nichts verbunden ist.

    LAZARUS-Quellcode

    1. procedure TForm1.FormCreate(Sender: TObject);
    2. begin
    3. // Füllfarbe des Zeichenobjektes Shape1 auf rot festlegen
    4. Shape1.Brush.Color:=clred;
    5. // Button1 wird INAKTIV geschaltet. Man kann ihn nicht anklicken!
    6. Button1.enabled := false;
    7. // wir schalten die FTDI Komponente EIN
    8. FTDI1.active := true;
    9. end;


    Die nächsten Schritte sind einfach zu verstehen:
    Die Farbe von Shape1 soll sich je nach Verbindungsstatus ändern.
    Selektiere im Objektinspektor FTDI1. Schalte auf die Ereignis Seite um. Hier siehst du nun zwei Ereignisse, welche den Connect- und Disconnect Status signalisieren.
    Für beide Ereignisse die Proceduren erzeugen und in den Proceduren die Farbe von Shape1, dem Ereignis anpassen. Außerdem soll man nichts senden können, wenn das Gerät nicht verbunden ist.

    LAZARUS-Quellcode

    1. procedure TForm1.FTDI1Connect(Sender: TObject);
    2. begin
    3. Shape1.Brush.Color:=clgreen;
    4. Button1.enabled := true;
    5. end;
    6. procedure TForm1.FTDI1Disconnect(Sender: TObject);
    7. begin
    8. Shape1.Brush.Color:=clred;
    9. Button1.enabled := false;
    10. end;
    Alles anzeigen


    Nun sollten wir noch die Eigenschaften der FTDI Komponente näher anschauen und einstellen.
    Passe zunächst die Baudrate an (19200 Bd)
    Wir wollen den DeviceDescriptor unseres FTDI CHip erst einmal nicht verändern und verbinden uns über einen ConnectString.
    Die Sendekennung legen wir für "ConnectSendString" fest auf: "Tron alive?" (ohne Anführungsstriche)
    Die Empfangskennung für "ConnectReplyString" legen wir fest auf: "Tron alive!" (ohne Anführungsstriche)

    Projekt speichern.

    Nun benötigen wir ein Programm für unsere Bascom Hardware, welche über das "FTDI Kabel" oder den "FTDI Baustein" verbunden ist:

    BASCOM-Quellcode

    1. '*************************** Sample for bascomforum.de ***************************
    2. '
    3. ' Author : Michael Koecher / six1
    4. ' created : 2016-12-27
    5. ' Version : 1.00
    6. '$regfile = "m8def.dat" 'Chip =17
    7. $regfile = "m8adef.dat" 'Chip =17
    8. $hwstack = 50
    9. $swstack = 50
    10. $framesize = 50
    11. $crystal = 8000000
    12. $baud = 19200
    13. $version 1 , 0 , 0
    14. 'Open "Com1:" For Binary As #1
    15. Config Serialin = Buffered , Size = 20 , Bytematch = 13
    16. Dim Rx_str As Byte
    17. Dim Data_in As String * 20
    18. Rx_str = 0
    19. Enable Interrupts
    20. Declare Sub Rx_data()
    21. ' *** MAIN ***
    22. Do
    23. ' wurde etwas empfangen?
    24. If Rx_str > 0 Then
    25. Rx_str = 0
    26. Call Rx_data
    27. Data_in = ""
    28. End If
    29. Loop
    30. ' *** END OF MAIN ***
    31. Sub Rx_data()
    32. If Data_in = "Tron alive?" Then
    33. Print "Tron alive!"
    34. Elseif Data_in = "1" Then
    35. Print "Du hast eine EINS gesendet"
    36. Else
    37. Print "Du hast '" + Data_in + "' gesendet."
    38. End If
    39. Data_in = ""
    40. End Sub
    41. Serial0charmatch:
    42. Input Data_in Noecho
    43. Rx_str = 1
    44. Return
    Alles anzeigen


    Hier kannst du sicher gut erkennen, was beim Empfang von "Tron alive?" passiert...

    In diesem Abschnitt hast du einiges Neue gelernt. Selektieren von Komponenten im Objektinspektor, neue Eigenschaften und neue Ereignisse.
    Ich hoffe, du hattest bis hierher Spaß an der Sache. Falls etwas nicht so klappen sollte wie das vorgesehen war, dann schreibe einen Kommentar. Ich werde dann versuchen das Problem(chen) zu lösen.
    Dadurch können andere auch etwas lernen.


    Michael Köcher / six1

    570 mal gelesen