[gelöst] /dev/tty... ungepuffert lesen?

  • >Lösung<


    Ich habe eine IO-Karte die sich mit /dev/ttyACM1 als 'normale' serielle Schnittstelle manifestiert. Wenn ich der Zeichenketten wie '~ver~' sende, sollte sie z.B. mit '~VER:5.1~' antworten. Auf Shellebene funktioniert das Senden via echo, was ich an Reaktionen der Karte sehen kann. Aber wie lese ich die Antworten?


    # echo '~ver~' >/dev/ttyACM1
    # read a < /dev/ttyACM1


    Das read wartet offenbar auf einen Zeilenumbruch, EOF o.ä., den es aber nicht gibt. Wie kriege ich die Antworten den 'roh' in eine Shellvariable?

    yaVDR 0.6.2; H61M/U3S3 / G530 / 4GB / GT 520 (passiv) / Cine S2 (Rev. V5.5) + DuoFlex S2 / 120GB SSD (System; SATA>USB) + 3TB SATA 6Gb/s; LCD-TV Toshiba 42VL863G; AVR Yamaha RX-S600...

    Einmal editiert, zuletzt von habichthugo ()

  • Ich würds in Python (oder Perl, oder was auch immer) machen. Weil du musst die Antwort parsen (auf das Start "~"warten und einlesen bis das End "~" kommt) um zu wissen wann alles da ist. Und du must damit rechnen das die Antwort nicht vollständig kommt (also Timeout) oder das mehr Zeichen kommen (die dann halt verwerfen).


    cu


  • # echo '~ver~' >/dev/ttyACM1
    # read a < /dev/ttyACM1


    Das read wartet offenbar auf einen Zeilenumbruch, EOF o.ä., den es aber nicht gibt. Wie kriege ich die Antworten den 'roh' in eine Shellvariable?


    Du kannst dem read ein Timeout mitgeben:
    # read -t 10 a < /dev/ttyACM1


    Wenn Deine Karte schnell antwortet, kannst Du im gleichen Thread die Antwort so nicht rücklesen.


    Gruß
    e9hack

  • Wenn Deine Karte schnell antwortet, kannst Du im gleichen Thread die Antwort so nicht rücklesen.

    Wieso nicht? Das wird doch gepuffert? Oder wird mit jedem Öffnen zum Lesen der Puffer gelöscht?


    Du kannst dem read ein Timeout mitgeben:
    # read -t 10 a < /dev/ttyACM1


    Aha. Nur wenn bis dahin kein LF kommt, dann wird doch weiterhin nichts gelesen? Ich hab' das 'read -t 10 ...' mal in einer Konsole gestartet, dann 'echo ...' in einer parallelen Konsole, aber in $a steht anschliessend nix.


    Das Ganze soll wie ein Call funktionieren: Die Karte antwortet auf jede Aktion, die ich sende. Und ich möchte anschliessend die Antwort auswerten. Möglichst direkt im Script...

    yaVDR 0.6.2; H61M/U3S3 / G530 / 4GB / GT 520 (passiv) / Cine S2 (Rev. V5.5) + DuoFlex S2 / 120GB SSD (System; SATA>USB) + 3TB SATA 6Gb/s; LCD-TV Toshiba 42VL863G; AVR Yamaha RX-S600...

  • Wieso nicht? Das wird doch gepuffert? Oder wird mit jedem Öffnen zum Lesen der Puffer gelöscht?


    Du kannst nur das Lesen, was nach dem Öffnen des Devices ankommt.


    Zitat

    Ich hab' das 'read -t 10 ...' mal in einer Konsole gestartet, dann 'echo ...' in einer parallelen Konsole, aber in $a steht anschliessend nix.


    Die Baudrate hast Du vorher richtig gesetzt?


    Gruß
    e9hack

  • Hm, ich kann mit stty nur die Einstellungen abfragen. Irgend was setzen hängt, z.B.


    # stty -F /dev/ttyACM1
    speed 9600 baud; line = 0;
    -brkint -imaxbel
    # stty -F /dev/ttyACM1 9600

    yaVDR 0.6.2; H61M/U3S3 / G530 / 4GB / GT 520 (passiv) / Cine S2 (Rev. V5.5) + DuoFlex S2 / 120GB SSD (System; SATA>USB) + 3TB SATA 6Gb/s; LCD-TV Toshiba 42VL863G; AVR Yamaha RX-S600...

  • Ok, mit stty Einstellungen verändern geht nach reboot (hotplug scheint problematisch). Dennoch kriege ich von /dev/ttyACM1 nix gelesen, auch nicht 'raw'. Auf Befehle via echo auf /dev/ttyACM1 reagiert die Karte aber, wie gesagt.


    Das mit der Baudrate hätte ich gerne erläutert. Das ist doch ein USB-Device...?

    yaVDR 0.6.2; H61M/U3S3 / G530 / 4GB / GT 520 (passiv) / Cine S2 (Rev. V5.5) + DuoFlex S2 / 120GB SSD (System; SATA>USB) + 3TB SATA 6Gb/s; LCD-TV Toshiba 42VL863G; AVR Yamaha RX-S600...

  • Keine Ahnung, ob das Deine Anforderungen erfüllt: xxd
    Damit habe ich schonmal Fernbedienungscodes ausgelesen.


    mfg

    plugin-block: Download, Thread im Portal, Wiki
    plugin-sleeptimer: Download, Thread im Portal, Wiki
    VDR-Chat: Web-Chat, IRC
    [size=8]ASUS M2N-E, Athlon X2 4450B, 2GB DDR2, Technisat Skystar HD (TT-3200), Technisat Skystar HD2, Hauppauge WinTV Nova-T USB, GigaByte GT-630 - 4TB RAID5 + 6GB externes Journal @50 GB Crucial Adrenaline SSD DP-CT050M4SSC2 - BeQuiet SystemPower7 300W - wheezy/vdr2.0.1 - xbmc 13

  • So, habe die Karte mal an einen Windows-Rechner gesteckt: Da erscheint (nach Installation der CDC RS232 Treiber) ein COM(4)-Port, den ich problemlos via puTTY ansprechen kann. Auf jede Aktion die ich (blind, ohne echo) eintippe erscheint im puTTY die erwartete Reaktion in Form einer 'normal' lesbaren Zeichenkette (z.B. '~OK~'), allerdings ohne Zeilenumbruch. Interessant ist auch noch, dass die Karte die korrekte Kommunikation via blinkender LED anzeigt (vor Treiberinstallation Dauerlicht, während der Installation langsam blinkend, danach schnell). Da sie unter Linux auch wie unter Win nach Treiberinstallation blinkt und auf Befehle via echo reagiert scheint mir hardware+treibermässig erst mal alles ok zu sein. Jetzt muss ich unter Linux das /dev/tty... nur noch überreden, die Antworten raus zu rücken.


    Leider habe ich zur Linux-Kiste nur Verbindung via puTTY (ssh), denn da hängt kein Bildschirm/Tastatur dran und es ist auch keine graphisch Oberfläche drauf. screen und minicom funktionieren bei mir aber via puTTY-Session nicht bzw. hängen sich bei Verbindung zu dem Device auf...


    !!! Hilfe !!!

    yaVDR 0.6.2; H61M/U3S3 / G530 / 4GB / GT 520 (passiv) / Cine S2 (Rev. V5.5) + DuoFlex S2 / 120GB SSD (System; SATA>USB) + 3TB SATA 6Gb/s; LCD-TV Toshiba 42VL863G; AVR Yamaha RX-S600...

  • Kannst ja noch picocom testen.


    Ansonsten musst du das Device offen halten.
    Dann lerne mal termios, da steht alles drin was du brauchst.
    z.b. stty min 1 lässt dich einzelne Zeichen lesen und bash builtin read kann auch einzelne Zeichen lesen


    Ein Script würde so ausschauen


    In mycode sind dann stdin und stdout deine Serielle Schnittstelle.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Wir haben das früher für das Testen der Kommunikation von seriellen Geräten so gemacht:
    Berechtigung sicherstellen: Beispiel /dev/ttyS1
    chmod 666 /dev/ttyS1


    Leitung offen halten:
    /usr/bin/nohup /bin/sleep 999999999 </dev/ttyS1 &


    Evtl. nötige Modi setzen:
    stty xyz abc >/dev/ttyS1


    Ausgabe senden:
    echo -e "HALLO \r \n" >/dev/ttyS1


    Antwort lesen:
    antwort </dev/ttyS1


    Antwort anzeigen:
    echo $antwort


    Gruss
    Uli

  • Das Grundproblem löst sich mit


    # stty -icanon </dev/ttyACM1


    Damit sagt man dem Device, dass es sofort und nicht zeilenweise ausgeben soll...


    Thanks@all

    yaVDR 0.6.2; H61M/U3S3 / G530 / 4GB / GT 520 (passiv) / Cine S2 (Rev. V5.5) + DuoFlex S2 / 120GB SSD (System; SATA>USB) + 3TB SATA 6Gb/s; LCD-TV Toshiba 42VL863G; AVR Yamaha RX-S600...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!