Über PHP Seriell Daten Senden und Empfangen

  • Hallo,


    ich habe an mein Raspberry PI B ein Atmega8L angeschlossen, dieser sammelt Analog Messwerte.


    Bis jetzt war er immer mit ein Terminal Verbunden, wenn ich dann z.b an den Atmega Gesendet habe: "Melde AD0"


    dann hat der Atmega geantwortet: "456"



    dies ist nur ein Beispiel, wie kann ich das ganze jetzt über PHP Machen? will also inn Steuerwort Senden und die Antwort wieder in einer Variable empfangen.



    Habe im Netz nicht viel gefunden, glaube ich zumindest, das schweifte immer schnell in richtung Python oder C ab, aber damit kann ich garnichts anfangen, PHP wäre mir deutlich lieber.



    Würde mich freuen wenn Jemand ein kleinen Tip geben kann.



    gruß blueberlin

  • Also wie ich dich verstanden habe, soll auf einer Webseite (php) immer ein
    aktueller Wert angezeigt werden?


    Ein einfacher Weg ist, vom pi periodisch einen upload des analogen Wertes mit FTP
    auf den Webspace in eine daten.txt Datei zu machen.


    In der Webseite z.B. einfügen


    PHP
    <?php
    $datei = implode("",file("daten.txt"));
    $zahl1 = number_format($datei 3);
    echo " ".$zahl1, " Wert aktuelle blabla";
    ?>


    wird jetzt die Webseite aufgerufen, wrd der aktuelle Wert angezeigt.
    Beim FTP-upload drauf achten, das dann immer der aktuelle Wert den letzten überschreibt.

  • Ich verstehe das eher so das er ein Web-Interface möchte über das er Daten über den Seriellen Port an seinen Arduino schicken und dessen antwort dann auf der Webseite angezeigt haben möchte....


    radioshack: dein number_format ist aber auch fehlerhaft, da fehlt ein Komma.. Allerdings versteh ich nicht so recht warum du das überhaupt anwendest, das verfälscht die Ausgabe nur unnötig - und ebenfalls komisch wieso du implode nutzt? :huh:


    Da wäre es wesendlich einfacher file_get_contents zu nutzen


    Aber FTP-Upload ist denk ich ebenfalls falsch - da scheinst du etwas arg missverstanden zu haben also lies den ersten Beitrag nochmal und achte auf die Stichworte:
    Seriell (überschrift) , Atmega8L , Terminal , Senden , Empfangen



    Ich gehe mal davon aus dass das Terminal sich auf /dev/ttyAMA0 verbindet :huh: Das wäre nämlich der Serielle Port (bzw UART) am RaspberryPI
    Um dort hin Daten zu senden leitet man es einfach dort hin um und empfangen geht dann genauso - das kannst du also ganz einfach testen indem du dich mit PuTTY 2x zum RaspberryPI verbindest und:


    - Im Ersten PuTTY gibst du folgendes ein:

    Code
    cat /dev/ttyAMA0

    oder:

    Code
    tail -f /dev/ttyAMA0


    - Im Zweiten PuTTY gibst du folgendes ein:

    Code
    echo "Melde AD0" > /dev/ttyAMA0


    ..Dann solltest du im Ersten-PuTTY die Antwort sehen..


  • da fehlt ein Komma.. Allerdings versteh ich nicht so recht warum du das überhaupt anwendest, das verfälscht die Ausgabe nur unnötig - und ebenfalls komisch wieso du implode nutzt? :huh:


    Da wäre es wesendlich einfacher file_get_contents zu nutzen


    Komma ist klar...die 3 Stellen deshalb weil der Wert wohl 3-stellig sein sollte (Dezimalstellen).


    file_get_contents ist wohl erste Wahl...ich habe mal früher
    implode genutzt bei einem größeren file weil die Performance
    besser sein soll. Ist aber hier wohl unerheblich.


    Die Quelle finde ich jetzt nicht mehr...hatte nur noch den screenshot.


    Aber ich habe das angesprochene Problem sowieso wohl falsch verstanden.
    Das kann an mir liegen, wenn zu viele Sachen gleichzeitig macht.
    Obwohl bei so manchem Themenersteller hier im Forum man tatsächlich nicht
    erkennt, was er will.

  • danke für eure schnelle antwort, leider komme ich nicht weiter...



    der Atmega wird mit 3,3 Volt vom PI Versorgt.


    Der TXD Port des Atmegas ist mit den RXD Port vom PI Verbunden.
    Der RXD Port des Atmegas ist mit den TXD Port vom PI Verbunden.


    der Atmega ist nun so Programmiert das er alle 5 Sekunden "hallo ich bin da" über diesen Port sendet.



    Eigendlich müsste wenn ich euch richtig verstanden habe mit den Befehl:


    Code
    cat /dev/ttyAMA0



    alle 5 Sekunden auf den PI in der Konsole "hallo ich bin da" angezeigt werden, doch leider passiert nichts.


    Was mich auf ein wenig verwundert, woher weiss der PI mit welscher Baudrate ich komunizieren will?


    der Atmega läuft auf 1200 Baud woher weiss der Pi das, wo muss ich das angeben?

  • Du musst erst den Seriellen Port vom RaspberryPI quasi "aktivieren" um ihn anderweitig verwenden zu können...


    Siehe: http://elinux.org/RPi_Serial_C…nux_using_the_serial_port


    Bedeutet also:


    /boot/cmdline.txt bearbeiten und die Zeile

    Code
    dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait


    Ändern in:

    Code
    dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait


    (also " console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 " raus löschen)


    Nach einem reboot kannst du dann /dev/ttyAMA0 ansprechen (ob mit einem Terminal wie minicom (siehe hier unter 'Using minicom on the UART'), oder nativ über das Device is relativ wurscht)


    Das wird auch auf folgendem Link ausführlich beschrieben (auch wie du die Baudrate festlegst usw): http://kampis-elektroecke.de/?page_id=1682




    Aber die Konsole musst du später dafür nicht nutzen - du möchtest ja PHP nutzen also wäre zB popen besser ;) Zum Beispiel mit einer function:
    [code=php]
    function _exec($cmd,$status="") {
    $S="&nbsp;";
    $fontcolour="ffffff";
    if ($status == "OK") { $fontcolour="009900"; }
    if ($status == "ERROR") { $fontcolour="FF0000"; }
    $handle = popen("$cmd 2>&1",'rb');
    while (!feof($handle)) {
    $line = stream_get_line($handle,10000,"\n");
    if (empty($line)) { continue; }
    if (preg_match("/^error/i",$line)) { $fontcolour="FF0000"; }
    $line = str_replace(" ",$S,$line);
    echo ("<font face='Arial, Helvetica, sans-serif' size='2' color='".$fontcolour."'>".$line."</font><br/>\n");
    flush();
    }
    pclose($handle);
    return;
    }
    [/php]


    Und in deinem PHP Script nutzt du dann an der gewünschten Stelle wo der Output ausgegeben werden soll:[code=php]_exec("tail -f /dev/ttyAMA0","OK");[/php]
    (wenn du soweit bist gehe ich da gerne weiter drauf ein)

  • jetzt bin ich weiter ;)


    wenn ich folgendes in die Konsole eingebe:


    Code
    sudo stty 1200 -F /dev/ttyAMA0
    cat /dev/ttyAMA0 >> /home/pi/test.txt



    dann schreibt der PI alles was er empfängt vom Atmega in die Textdatei, das klappt schonmal ;)


    nur das senden vom PI an den Atmega will noch nicht, da kommt nichts an, naja das bekomme ich schon noch raus ;)



    kann es sein das der pi wenn ich "hallo" sende garnicht hallo raus schickt sondern das zum beispiel in asci oder binär wandelt und dann sendet? dann wäre es mir kla warum der atmega auf meine befehle nicht antwortet.

  • ja ganz sicher 1200 Baud, der Atmega läuft mit 1 MHZ und deswegen habe ich 1200Baud genommen da ist die Fehlerquote am niedrigsten und empfangen tuh ich ja jetzt auch alles sauber vom Atmega nur das senden geht noch nicht, werde morgen mal den atmega aufzeichnen lassen was er empfängt und dann mir wieder zurück senden lassen, vielleicht löst das das problem schon ;)


    habt aber vielen dank.. ein super forum beide daumen hoch !!!!