serielle Schnittstelle

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Leute,

    ich verzweifle gerade dabei, die serielle Schnittstelle in C zu programmieren.

    Code
    #include <wiringSerial.h>
    int main(void)
    {
      int fd = serialOpen("/dev/ttyAMA0",9600);
      serialPutchar(fd,'H');
      serialClose(fd);
    }

    Das Programm wird ohne Fehlermeldungen compiliert mit:

    gcc test.c -l wiringPi

    und dann ohne Fehlermeldungen ausgeführt mit:

    ./a.out

    Das Oszilloskop hängt an Pin 8 und da kommt nichts raus. Beim Hochfahren des Raspi sehe ich aber auf dem Pin was.

    Was ist an meinem Programm falsch?
    Muss das Pin vorher als Ausgang freigegeben werden? Gehe eigentlich davon aus, dass das bereits durch serialOpen() erledigt wird.
    Muss die serielle Schnittstelle in den Preferences freigegeben werden oder nicht (schon probiert, geht beides nicht)

    Gruß
    Michael

  • Hallo Maus3333,

    der Raspberry Pi nutzt beim Hochfahren die zu dem Zeitpunkt aktivierte serielle Schnittstelle, um über TxD zu Diagnose-Zwecken die Boot-Zeilen auzugeben. Sobald der Boot-Vorgang beendet ist, wird die serielle Schnittstelle deaktiviert und die beiden Pins RxD und TxD erhalten eine normale GPIO-Funktionalität.

    Deswegen siehst Du beim Booten auch etwas auf Deinem Oszi.

    Wenn Du die Funktionalität für die Zeit nach "der Geburt" verlängern möchtest, dann musst Du dies wie alle vor Dir auch Deinem RPi mitteilen. Dreamshader hat Dir dazu einen Link gegeben. Daneben gibt es viele andere. Ich habe auch mal einen ausführlichen Text zu dem Thema erdichtet.


    Gutes Gelingen!

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Sorry ... mein Fehler ... danke für den Hinweis.
    Da muss beim zweiten "disable" rein ...

    cu,
    -ds-

    Also ich habe das mit "disable" ausgeführt und mit "status" nochmal überprüft.
    Beim Hochfahren sehe ich immer noch Daten auf Pin 8, und mein Programm geht immer noch nicht.

    Gruß
    Michael

  • Mh ... Du kannst noch überprüfen, ob in Deiner /boot/cmdline.txt

    Code
    pi@rpi-lcurr ~ $ cat /boot/cmdline.txt 
    dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait


    der console-Parameter noch evtl. auf AMA0 steht und ggf. nach z.B. tty1 ändern.

    Wie stellst Du fest, dass das Programm nicht funktioniert?
    Oszi halte ich, bei nur einem Zeichen, für keine gute Idee ...

    Versuch mal besser z.B. minicom ( das musst Du evtl. noch installieren ).
    Mit

    Code
    minicom -D /dev/ttyAMA0


    spollte kein login-Prompt mehr erscheinen.
    Wenn Du dann noch die Parameter richtig setzt, sollte Deine Ausgabe erscheinen.
    Minicom ist imho selbsterklärend ... wenn auch für Mausfreaks etwas ungewöhnlich zu bedienen ...

    Code
    man minicom


    hilft im Zweifelsfall weiter.
    Oder eben cutecom oder ein anderes Terminalprogramm nehmen.

    Ultimativer Funktionstest:
    das echo in minicom ausschalten und beide Pins (Rx und Tx) verbinden. Dann sollte alles, was getippt wird, im Fenster von minicom erscheinen.

    //EDIT: was noch anzumerken wäre:
    serielle I/Os unter Linux sind nicht so trivial wie es auf den ersten Blick scheint.
    Da kommen solche Dinge wie Buffer, raw und cooked mode, ... ins Spiel.
    Einen Überblick über die Einstellungen bekommst Du mit:

    -> man stty <- bzw. -> man termios <-, wobei letzteres die systemcall-Ebene beschreibt.


    cu,
    -ds-

  • Hi,
    wenn es Dich nicht weiter stört, dass evtl. einiges beim booten dort ausgegeben wird, würde ich das einfach lassen. Ansonsten probier halt tty1 aus.
    Wichtiger fände ich die Frage, ob Du mit minicom andere Aktivitäten feststellst bzw. inwieweit Deine Ausgaben in minicom sichtbar sind.
    Das wäre jetzt das, was ich als ersten ausprobieren würde.
    Ein CR hinter dem Zeichen oder ein fflush() würde die Ausgabe erzwingen ... da sollte was passieren. Sonst läuftst Du Gefahr, dass das Zeichen gebuffert und nichts übertragen wird.
    Ein cat auf z.B. /etc/passwd oder sonst eine Textdatei mit Umleitung nach /dev/ttyAMA0 sollte übrigens auch in minicom sichtbar sein.

    cu,
    -ds-


  • Wichtiger fände ich die Frage, ob Du mit minicom andere Aktivitäten feststellst bzw. inwieweit Deine Ausgaben in minicom sichtbar sind.

    Habe Minicom installiert. Kein Signal auf Pin 8, und logischerweise auch kein Echo wenn ich Pin 8 und Pin 10 verbinde.
    Sollte sich das Programm auch irgendwie wieder beenden lassen?
    Wenn ich sofort nach Programmstart ctrl-a drücke, erscheint unten eine Zeile. Danach passiert nichts mehr, egal welche Taste ich drücke.

    Fehlbedienung des Oszilloskops kann ich 100% ausschließen. Wenn auf Pin 8 was wäre, dann würde ich es sehen, egal wie kurz das Signal ist.

    Michael

  • CTRL-A dann q ist beenden, CTL-A und dann h ist die Hilfe-Funktion ... man minicom liefert weitere Infos.

    also wenn ich Rx und Tx mit einem Jumper brücke, erscheint alles, was ich tippe sofort in minicom ...
    Beim Oszi meinte ich keine Fehlbedienung, sondern dass ein einzelnes Zeichen evtl. gar nicht gesendet sondern gepuffert wird.

    cu,
    -ds-


  • CTRL-A dann q ist beenden, CTL-A und dann h ist die Hilfe-Funktion ... man minicom liefert weitere Infos.

    Also sofort nach Programmstart funktioniert ctrl-a noch, aber nachdem ich versucht habe ein Zeichen zu senden geht ctrl-a nicht mehr. Minicom hängt dann fest und kann nur noch durch Schließen des Fensters beendet werden.
    Automatisch zusammengefügt:
    In verschiedenen Anleitungen, z.B hier
    http://www.hobbytronics.co.uk/raspberry-pi-serial-port
    steht geschrieben das man die Datei /etc/inittab editieren soll. Diese Datei gibt's bei mir aber gar nicht.

    Gruß
    Michael

    Einmal editiert, zuletzt von maus3333 (29. Juni 2016 um 23:40)

  • Du hast mincom aber schon mit -D /dev/ttyAMA0 aufgerufen?
    Dann ist bei Dir irgendwas anderes faul ...
    Also CTRL-A q, CTRL-A h, .... sollten immer funktionieren.

    Was die inittab betrifft: das ist ab Jessie nicht mehr möglich, weil es die eben nicht mehr gibt.

    Kann es sein, dass Du mal was an der rs232 des RPi angeschlossen hattest und die serielle 5V erwischt hat?

    cu,
    -ds-

  • Das Problem ist gelöst. Ich habe zunächst das gemacht was in dem obengenannten Link beschrieben war. Danach ging das Minicom immer noch nicht.
    Dann habe ich beim Aufruf von Minicom die Schnittstelle /dev/ttyS0 angegeben, und siehe da ich kriege ein Echo wenn die Pins 8 und 10 gebrückt sind.
    Und mein Programm läuft jetzt auch, nachdem ich "ttyAMA0" durch "ttyS0" ersetzt habe.

    Gruß
    Michael

  • Also das was hier
    https://forum.fhem.de/index.php?topic=50340.0
    beschrieben wurde ist bei meinem Raspi3 _nicht_ notwenig. Ich habe die Zeile
    dtoverlay=pi3-disable-bt-overlay
    in der config.txt wieder rauskommentiert und es geht immer noch.
    Es genügt, die richtige Bezeichnung für die serielle Schnittstelle zu verwenden:
    minicom -b 9600 -D /dev/ttyS0 -o
    und wenn man dann die Pins 8 und 10 verbindet dann sieht man das Echo.

    Allerdings hatte ich noch ein anderes Problem zu überwinden:
    Ich hatte diesen USB/RS232 Adapter gekauft:
    http://www.ebay.de/itm/301443736675
    Den roten Draht kann man umlöten auf 3.3V, das ist ja dort schon beschrieben. Wenn man allerdings TXD und RXD so anschließt wie dort beschrieben, dann ist es genau falsch rum. Dann arbeitet Ausgang gegen Ausgang. Der weiße Draht muss auf Pin 8 und der grüne auf Pin 10. Der schwarze auf GND, das ist klar. Den roten Draht schließt man am besten gar nicht an. Sonst würde nämlich der USB Adapter versuchen, den ganzen Raspi mit Strom zu versorgen, und dann wird der Adapter ziemlich heiß und schafft es trotzdem nicht.

    Gruß
    Michael

  • Ok super, vielen Dank.

    Von dem USB-Adapter mit PL2303HX habe ich auch einige hier. Die kommen bei des ESP8266-Modulen zum Einsatz. Ich hatte da mal einen ausgemessen und festgestellt, dass zwar die Signale 3V3 Pegel haben, die Spannung zwischen GND und PLUS aber 5V beträgt.
    Deshalb habe ich von anfang an das rote Kabel gekappt ;) ...

    Wie gesagt, danke für die Infos und viel Spass und Erfolg noch mit Deinen Projekten,
    -ds-

  • Hallo Maus3333,

    die Info, dass Du einen RPi 3B einsetzt, hätte ein wenig früher (und deutlicher) kommen können. Dann wäre der Thread nach wenigem Hin und Her beendet worden.

    Eine gute Informationsquelle befindet sich hier. Dort wird im Detail beschrieben, wie die serielle Schnittstelle für den RPi 3B vorbereitet wird. Und vor Allem: /dev/ttyAMA0 gibt's da nicht mehr. Die Schnittstelle heißt jetzt ttyS0. Dies ist bei der dort weiter beschriebenen Vorgehensweise zu verwenden, wenn sonst von ttyAMA0 die Rede ist.

    Das dürfte dann auch erklären, weshalb Dein Oszi was sieht. Und über ttyAMA0 keine Datentransfers festgestellt werden können.

    Ansonsten hängt die Konfiguration sehr stark vom Betriebssystem und dessen Version ab, auf welche Weise die Konfiguration anzupassen ist, damit UART neben oder statt Bluetooth funktioniert.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (1. Juli 2016 um 10:07)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!