Announcement

Collapse
No announcement yet.

COM Schnittstelle über PHP ansprechen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • COM Schnittstelle über PHP ansprechen

    Hallo

    Vielleich hat jemand von euch eine Idee oder Hinweis.

    Problembeschreibung: Ich habe eine Microcontrollersteuerung, diese wird über USB/COM Schnittstelle per Terminal angesprochen. (Ein/Ausgabe).

    Ziel: Aus einen Browser Daten an PHP -> COM zu übergeben bzw übernehmen und auszugeben.


    Frage: Gibts eine passende Funktion in PHP um diese anzuspechen.


    Danke im Voraus.

  • #2
    PHP = Server
    COM = Client

    Geht nicht
    Christian

    Comment


    • #3
      Du hast recht, allerdings könnte man auf die seriellen Schnittstellen des PC zugreifen.

      Code:
      $string = "Hallo Schnittstelle!\n";
      $pointer = fopen("/dev/ttyS0","w");
      fwrite ($pointer, $string);
      fclose($pointer);
      Quelle Code:http://www.php-faq.de/q-php-schnittstelle.html

      Direct-IO-Funktionen:http://de.php.net/manual/de/ref.dio.php


      Habe aber mit "/dev/ttyS0" ein Verständnisproblem
      bzw
      Ob Direct-IO geeignet ist (spricht zumindest den Terminal an) - ist die Frage
      Zuletzt editiert von mr_sol; 12.06.2011, 11:38.

      Comment


      • #4
        Nein, kannst du nicht, weil
        PHP = Server
        COM = Client
        Das steht aus so in deinem Link

        Da PHP serverseitig interpretiert und ausgeführt wird, ist es nicht möglich, mit PHP auf die serielle Schnittstelle eines Clients zuzugreifen.

        Es steht weiterhin da

        Allerdings besteht die Möglichkeit, auf die seriellen Schnittstellen des Computers zuzugreifen, auf dem das Script ausgeführt wird.

        Auf Deutsch:
        Wenn das Script auf dem Rechner läuft, auf dem auch der Client ist, kann man auf die serielle Schnittstelle zugreifen. Das dürfte regelmäßig nicht der Fall sein. Ohnehin ist die Aussage wertlos, da ich natürlich mit dem Script auf dem Rechner wo das Script läuft alles machen kann (Rechte voraussgesetzt). Wenn so ein Fall vorliegt, stellt sich auch die Frage, warum dann eine Browseranwendung genutzt wird

        "/dev/ttyS0" bezieht sich auf UNIX/LINUX Systeme
        Zuletzt editiert von Christian Marquardt; 12.06.2011, 12:11.
        Christian

        Comment


        • #5
          Hallo Christian.
          Erstmal vielen Dank für deine Anworten.

          "/dev/ttyS0" bezieht sich auf UNIX/LINUX Systeme
          wusste ich nicht.

          Das MC-Bord liefert über den Terminal die Datenauswertung, diese am Browser anzuzeigen ist mein Ziel. Leider gehts nicht über LAN sondern nur USB/UART bzw COM Schnittstelle. Hier geht es nicht um Fernwartung sonder nur die PC eigene Schnittstelle (Server,Client am selben Rechner).

          Schade....dürfte zu "Exotisch" sein.

          Danke

          Comment


          • #6
            Warum schreibst du dann nicht eine Clientanwendung die das macht? Die Anzeige der Daten kann ja über Browser erfolgen
            Christian

            Comment


            • #7
              Langsam komme ich der Sache näher.

              Die COM unter Windows - wird schon mal angesprochen.

              Code:
              <?php
              /**
              * EIN/AUSGABE ueber COM
              *
              * Einfache Ein/Ausgabe ueber COM Schnittstelle
              *
              * @V0.1      2011.06.13 Schnittstelle angesprochen
              */
              
              
              /**
              * Set serial port parameters. Laut Doku: 9600 8-N-1
              * Baud rate: 9600
              * Parity (das "N" in "8-N-1") - Datenblock auf korrekten Inhalt zu überprüfen
              * data - Character length (die "8" in "8-N-1")
              * Stop bits (die  "1" in "8-N-1") 
              * DTR - Data Terminal Ready 
              * RTS - Request to Send [Sendeanforderung]
              */
              $fp=`mode com2 BAUD=9600 PARITY=N data=8 stop=1 DTR=off  RTS=off`; 
              
              echo $fp; 
              
              if (!$fp = fopen ("com2", "r+")) 
              { 
              echo "<br>";
              echo ' Anschluss konnte nicht geoeffnet werden!!!'; 
              } 
               
              while (!feof($fp))
              {
              $line=fgets($fp, 512);
              echo $line."<br/>";
              }
              fclose($fp);
              
              
              ?>
              Ich suche eine besser Lösung zum Datenlesen. Eine Idee.....?

              Comment


              • #8
                Was ist besser? Byteweise? Blocks?
                Christian

                Comment


                • #9
                  Gute Frage - Blockweise. Denkst du an stream_get_line()?

                  Comment


                  • #10
                    Nö, denke an garnichts, da ich nicht weiss was in der Datei drin ist. Sollen Zeilen gelesen werden, ist o.a. oder auch stream_get_line() zu nutzen. Und riesiggroß ist die Datei wohl auch nicht
                    Für alles andere würde ich blockweise lesen
                    Christian

                    Comment


                    • #11
                      Zwei Möglichkeiten der Daten (muss ich erst testen) - Es sind geloggte Daten des I/O des MC Boards - über eine gewisse Zeit.

                      Ausgabe:
                      1. Text pure (CSV)
                      2. XML Struktur

                      Ist Blockweise besser - und wie?


                      Eingabe:
                      Zum steuern der Ausgabe.

                      Comment


                      • #12
                        Wenn es sich um XML-Daten handelt und du diese verarbeiten musst (nich tnur irgendwohin kopieren), dann empfiehlt es sich, diese gleich so einzulesen, dass sie verarbeitet werden können

                        http://php.net/manual/de/book.simplexml.php
                        Christian

                        Comment


                        • #13
                          Danke für den Link.
                          Bevor ich alles auf XML umstelle, gibt noch ein Problem.

                          Diese Version klappt perfekt
                          Code:
                          <?php
                          /**
                          * EIN/AUSGABE ueber COM
                          *
                          * Einfache Ein/Ausgabe ueber COM Schnittstelle unter Windows
                          *
                          * @V0.1 2011.06.13 Schnittstelle angesprochen
                          * @V0.2 2011.06.14 Lesen, Schreiben    
                          */
                          
                          
                          /**
                          * Set serial port parameters. Laut Doku: 9600 8-N-1
                          * Baud rate: 9600
                          * Parity (das "N" in "8-N-1") - Datenblock auf korrekten Inhalt zu überprüfen
                          * data - Character length (die "8" in "8-N-1")
                          * Stop bits (die  "1" in "8-N-1") 
                          * DTR - Data Terminal Ready 
                          * RTS - Request to Send [Sendeanforderung]
                          */
                          $fp1=`mode com2 BAUD=9600 PARITY=N data=8 stop=1 DTR=off  RTS=off`; 
                          $fp2=`mode com2 BAUD=9600 PARITY=N data=8 stop=1 DTR=off  RTS=off`; 
                          
                          echo $fp1; 
                          echo $fp2;
                          
                           
                          function senden($comport,$zeichen)
                          {
                            $fp1 = fopen ("$comport", "w+");
                            if (!$fp1){
                               echo "Port zum Schreiben nicht geöffnet!";
                               }
                               else {
                               fputs ($fp1, $zeichen);
                               fclose ($fp1);
                               }
                          }
                          
                          function lesen($comport2,$sekunden)
                          {
                            $buffer = "";
                            $fp2 = fopen ("$comport2", "r+");
                            if (!$fp2){
                             echo "Port zum lesen nicht geöffnet";
                             }
                             else{
                               sleep($sekunden);
                               $buffer .= fgets($fp2, 4096);
                             }
                             return $buffer;
                             fclose ($fp2);
                          }
                           
                          senden("COM2","5"); // den Text X senden
                          $lese = lesen("COM2","3"); // 2 Sekunden lang Daten von COM2
                          echo "Ergebnis:".$lese;
                           
                          ?>

                          Das gleiche als OOP send() klappt - read() nicht

                          Code:
                          <?php
                          /**
                          * EIN/AUSGABE ueber COM
                          *
                          * Einfache Ein/Ausgabe ueber COM Schnittstelle unter Windows
                          *
                          * @V0.1 2011.06.13 Schnittstelle angesprochen
                          * @V0.2 2011.06.14 Lesen, Schreiben , OOP, Error
                          */
                          
                          
                          /**
                          * Error Message Stack
                          */
                          class errorMsg {
                           static private $aMsg = array();
                           static public function setError($p_sMsg = null) {self::$aMsg[] = $p_sMsg;}
                           static public function getError() {return self::$aMsg;} 
                           static public function isError() {return count(self::$aMsg) ? true : false;}  
                          }
                          
                          
                          
                          /**
                          * I/O uber Schnittstelle
                          */
                          class oCOM{ 
                          
                          /**
                          * Konstruktor
                          *
                          * Set serial port parameters. Laut Doku: 9600 8-N-1
                          * Baud rate: 9600
                          * Parity (das "N" in "8-N-1") - Datenblock auf korrekten Inhalt zu überprüfen
                          * data - Character length (die "8" in "8-N-1")
                          * Stop bits (die  "1" in "8-N-1") 
                          * DTR - Data Terminal Ready 
                          * RTS - Request to Send [Sendeanforderung]
                          *
                          */
                           public function __construct() 	{
                           
                          $fp1=`mode com2 BAUD=9600 PARITY=N data=8 stop=1 DTR=off  RTS=off`; 
                          $fp2=`mode com2 BAUD=9600 PARITY=N data=8 stop=1 DTR=off  RTS=off`; 
                          errorMsg::setError($fp1);
                          errorMsg::setError($fp2);
                          }
                          
                          /**
                          * Klasse wird zerstört
                          *
                          */
                           public function __destruct() {
                           }
                          
                           /**
                           * Senden der Daten ueber UART
                           */
                           public function send($comport,$zeichen) {
                            $this->fp1 = fopen ("$comport", "w+");
                            if (!$this->fp1){
                          	 errorMsg::setError("Port zum Schreiben nicht geöffnet!");	
                               }
                               else {
                               fputs ($this->fp1, $zeichen);
                               fclose ($this->fp1);
                               }
                           }
                          
                           /**
                           * Lesen der Daten ueber UART
                           */
                           public function read($comport2,$sekunde) {
                            $buffer = "";
                            $this->fp2 = fopen ("$comport2", "r+");
                            if (!$this->fp2){
                             errorMsg::setError("Port zum lesen nicht geöffnet");	
                             }
                             else{
                               sleep($sekunden);
                               $buffer .= fgets($this->fp2, 4096);echo $buffer;echo "x";
                             }
                             return $buffer;
                             fclose ($this->fp2);
                          }
                          } //END io
                          
                           /**
                          * 
                          */
                          $oCOM = new oCOM;
                          $oCOM->send("COM2","5");                   // den Ziffer 2 senden
                          $lese = $oCOM->read("COM2","3");       // 2 Sekunden lang Daten von COM2 abfragen
                          echo "Ergebnis:".$lese;
                          
                          /**
                          * wenn Fehlermeldungen existieren, diese ausgeben
                          */
                          if (errorMsg::isError()) {
                           echo '<br/>'.PHP_EOL;
                           echo '--------------------:<br/>'.PHP_EOL; 
                           echo 'Warnungen und Fehler:<br/>'.PHP_EOL;
                           var_dump(errorMsg::getError());
                           echo '--------------------:<br/>'.PHP_EOL;
                          }
                          
                          
                           
                          ?>

                          siehst du einen Fehler in der OOP Version? Ich find einfach nix.

                          Comment


                          • #14
                            Erstmal vielen Dank für deine Unterstützung.

                            Konklusion:
                            Per PHP COM Schnittstelle ansprechen kann man mit JAEIN beantworten.

                            Anscheinend ist PHP nicht geeignet, stabile Ergebnisse zu liefern. Senden klappt einwandfrei, der Empfang ist ein Problem.

                            In der Demo klappt er nicht.


                            com_schnittstelle.php
                            Code:
                            <?php
                            /**
                            * EIN/AUSGABE ueber COM
                            *
                            * Einfache Ein/Ausgabe ueber COM Schnittstelle unter Windows
                            *
                            * @V0.1 2011.06.12 Schnittstelle angesprochen
                            * @V0.2 2011.06.13 Lesen, Schreiben , OOP, Error
                            * @V0.3 2011.06.14 HTML Ein/Ausgabe
                            */
                            
                            
                            /**
                            * Error Message Stack
                            */
                            class errorMsg {
                             static private $aMsg = array();
                             static public function setError($p_sMsg = null) {self::$aMsg[] = $p_sMsg;}
                             static public function getError() {return self::$aMsg;} 
                             static public function isError() {return count(self::$aMsg) ? true : false;}  
                            }
                            
                            
                            
                            /**
                            * I/O uber Schnittstelle
                            */
                            class oCOM{ 
                            
                            
                            /**
                            * Konstruktor
                            *
                            * Set serial port parameters. Laut Doku: 9600 8-N-1
                            * Baud rate: 9600
                            * Parity (das "N" in "8-N-1") - Datenblock auf korrekten Inhalt zu überprüfen
                            * data - Character length (die "8" in "8-N-1")
                            * Stop bits (die  "1" in "8-N-1") 
                            * DTR - Data Terminal Ready 
                            * RTS - Request to Send [Sendeanforderung]
                            *
                            */
                             public function __construct(){}
                             public function __destruct(){}
                            
                             
                            /**
                            * Senden der Daten ueber UART
                            */
                            public function send($comport,$zeichen) { 
                              `mode com2: BAUD=9600 PARITY=N data=8 stop=1 xon=off`;
                              $fp = fopen ("$comport", "w+");
                              if (!$fp)
                              {
                              errorMsg::setError("Port zum Schreiben nicht geöffnet!");
                              }
                              else {
                              fputs ($fp, $zeichen);
                              fclose ($fp);
                              }	 
                            }
                            
                            /**
                            * Lesen der Daten ueber UART
                            */
                            public function read($comport2,$sekunde) {
                              `mode com2: BAUD=9600 PARITY=N data=8 stop=1 xon=off`;
                              $buffer = "";
                              $fp2 = fopen ("$comport2", "r+");
                              if (!$fp2)
                              {
                              errorMsg::setError("Port zum lesen nicht geöffnet");
                              }
                              else
                              {
                              sleep($sekunden);
                              $buffer .= fgets($fp2, 4096);
                              }
                              return $buffer;
                              fclose ($fp2);
                            }
                              
                              
                            } //END io
                            
                            
                            /**
                            *  MAIN
                            */
                            $com="com2";
                            $input="1";
                            $lese = "kein Ergebnis";
                            
                            if(isset($_GET["com"]))$com=$_GET["com"];
                            if(isset($_GET["input"]))$input=$_GET["input"];
                            
                            $oCOM = new oCOM;
                            $oCOM->send($com,$input); 
                            $lese = $oCOM->read($com,"2"); 
                            echo $lese;
                            ?>
                            
                            
                            
                            
                            
                            
                            
                            
                            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                                 "http://www.w3.org/TR/html4/loose.dtd">
                            <html>
                            <head>
                            <title>IO Test</title>
                            </head>
                            <body>
                            <h3>Senden auf COM</h3>
                            <p>
                            
                              <form action="com_schnittstelle.php" method="get" enctype="MIME-Typ">
                                 <label>Schnittstelle: </label>
                                <input name="com"type="text" value="COM2">
                                <label>Sende Ziffer 0- 9: </label>
                                <input name="input"type="text" value="1">
                            	<input type="submit" value="senden">
                              </form>
                            
                            
                            <h3>Empfangen von COM</h3>
                            <code style="white-space:pre-wrap !important;">
                            <?php
                            echo $lese;
                            ?>
                            </code>
                            <h3>Error/Log</h3>
                            <p>
                            <?php
                            /**
                            * wenn Fehlermeldungen existieren, diese ausgeben
                            */
                            if (errorMsg::isError()) {
                             var_dump(errorMsg::getError());
                            }
                            ?>
                            </p>
                            </body>
                            </html>

                            Hier eine Link wo es klappt (aber nicht immer)
                            http://www.mikrocontroller.net/topic/101642

                            Nur Senden klappt
                            http://www.phpclasses.org/package/36....html#download

                            Nicht uninteressant
                            http://www.communitymx.com/content/a...ge=2&cid=8658A


                            Falls noch jemand noch eine Idee oder Anregung hat bitte mitteilen. Danke im voraus.
                            Zuletzt editiert von mr_sol; 15.06.2011, 08:25.

                            Comment

                            Working...
                            X