[gelöst] Mit /dev/ttyACMx kommunizieren!?

  • -> Lösung


    Das hat jetzt nix mit dem VDR zu tun, aber mit Scripting, und da seid ihr ja fit hier!?


    Ich habe unter Ubuntu 12.4 (und vorher Debian) seit Jahren ein Script laufen, das nun unter Ubuntu 14.4 nicht mehr will. Dabei wird eine spezielle USB-IO-Karte über ein pseudo serielles Device angesprochen. Man schreibt Zeichenketten der Form ~<Befehl>~ hin und bekommt eine Antwort ~<Ergebnis>~, dabei kein Zeilenumbruch (wird bein schreiben ignoriert, zurück kommt also quasi ein immer länger werdender String). Ok, so sah das (verkürzt) aus:


    Wenn man das mit bash -x laufen lässt sieht man, dass er beim read hängen bleibt (was wegen 1s timeout eigentlich nicht geht. Jetzt fragt mich nicht, was das mit dem stty usw. sollte, jedenfalls hat es funktioniert.


    Prinzipiell geht die Kommunikation auch noch, und zwar wenn ich in Konsole A

    Code
    { read -t 10 -d '~'; read -t 1 -d '~' x; echo $x; } <"$DEV"


    und dann in Konsole B

    Code
    echo "~DS0~" >"$DEV"

    ^
    kommt in Konsole A die gewünschte Antwort.


    Ok, also wieder als Script...


    ...nix! Geht einfach (nach timeout) über die reads.


    Wie kriege ich das wieder hin? Von mir aus auch in Perl oder C.


    Es ist wichtig, dass die Leseseite schon geöffnet ist, bevor der Befehl geschrieben wird, ansonsten landet die Antwort im Nirvana. Ich habe auch schon versucht das echo (mit sleeps usw.) abzuforken u.ä., aber es hilft nichts...

    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 verstehe zwar noch nicht so ganz, was du willst...


    ...aber funktioniert das:



    Die Antwort kommt dann aus dem "echo $x"
    Irgendwie glaube ich auch dass es << "$DEV" heißen muss (also mit zwei Pfeilen)

  • Ich verstehe zwar noch nicht so ganz, was du willst...
    ...aber funktioniert das:
    ...
    ..Die Antwort kommt dann aus dem "echo $x"
    Irgendwie glaube ich auch dass es << "$DEV" heißen muss (also mit zwei Pfeilen)


    Ne, kann nicht funktionieren. Du stellst eine Frage an das Device (z.B. "~DS0~" ) und das antwortet dann (z.B. "~1~"). Erst schreiben und dann erst das Device zum lesen öffnen geht aber auch nicht. Das Device muss vor der Anfrage schon zum lesen geöffnet sein...
    Hat ja - wie gesagt - alles schon einige Jahre unter verschiedenen Systemen (Debian, Ubuntu) funktioniert.
    Und >> war für 'an Datei anfügen' (statt > 'überschreiben'). << kenn ich nicht.

    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...

  • Ach ja: Wegen des nicht vorhandenen Zeilenumbruchs das -d '~' (delimiter). Das erste read schluckt also nur den ersten '~' der Antwort, das zweite liesst dann die Nutzinfo. zum abschliessenden '~'.

    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...

  • Ja aber genau das tut es doch. ...


    Nein, dann müsstest du sie (mit &) in den Hintergrund schicken. Geht aber auch nicht (schon probiert) und würde mir nicht helfen, denn ich brauche das letztlich wieder als Funktionsaufruf.

    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...

  • "myio" gibt es zweimal, einmal als Variable und dann noch als Funktion.
    Ich würde da sicherheitshalber zwei unterschiedliche Namen verwenden.


    Ich weiss jetzt nicht ob das ein Problem ist, aber Shellskripte sind bei sowas oft zickig.



    Ich würde es mal so versuchen:

    Gruss
    SHF


  • Die allermeisten modernen seriellen Devices interessieren sich nicht großartig dafür ob auf der Gegenseite jemand zuhört. Es wird einfach in der definierten Baudrate an das Ziel übermittelt. Wenn keiner zuhört, dann verfällt die Info.


    Um sicherzustellen, dass jemand zuhört, musst du die Verbindung zum Device offen lassen. Du kannst nicht einfach mit "echo" hinsenden, und irgendwann später erwarten etwas lesen zu können, sondern die Leserichtung muss stehen bevor du sendest.


    Schau dir mal "exec" an. Eventuell hilft sowas:


    Code
    exec 3>/dev/ttyXXX
    exec 4</dev/ttyXXX
    echo "command to send" >&3
    read -u 4 ...


    Wenn das nicht hilft musst du, wie schon von SHF angemerkt, in der Tat zwei Shells parallel laufen lassen damit eine kontinuierlich lesen kann während die zweite sich um das Senden kümmert. Das wird dann halt knifflig wenn das ein bidirektionaler Datenaustausch werden soll. Also mehrere Befehle hin und zurückwandern sollen.

  • So geht es jetzt:


    Der letzte Kick war die Option -n beim echo.
    Trotzdem komisch, dass das Script am Anfang Jahre lang reibungslos seinen Dienst unter Debian und Ubuntu verrichtet hat...

    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!