Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] DIO Antwort zu kurz

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • keithkeith
    hat ein Thema erstellt [Erledigt] DIO Antwort zu kurz.

    [Erledigt] DIO Antwort zu kurz

    Hallo,
    ich hole per DIO einen String von einem Arduino an
    Es handelt sich dabei um eine Temperatur (23.234)
    PHP-Code:
    $fd dio_open('/dev/ttyACM0',O_RDWR O_NOCTTY O_NONBLOCK);
    if (!
    $fd) {
          
    /* handle the failure to open the file */
          
    echo 'Fehler beim Öffnen der Seriellen Schnittstelle';
        } else {
          
    //dio_seek($fd, 0, SEEK_SET);
          
    dio_fcntl($fdF_SETFLO_SYNC);
          
    dio_tcsetattr($fd, array('baud' => 9600,
                                   
    'bits' => 8,
                                   
    'stop' => 1,
                                   
    'parity' => 0));
          
    /* save the file descriptor in a session var */
          //$_SESSION['fd'] = $fd;
          
    $w dio_write($fd$wert);
          echo 
    "Schreibe an Arduino: " .$w"<br>";
          
    $r dio_read($fd6);
          echo 
    strlen($r);
          echo 
    "Bekomme von Arduino (Temperatur): " .$r"<br>";
        }

    dio_close($fd); 
    Nur leider liefert er nie den gesamten String aneinander, immer nur max drei Zeichen.
    Woran kann das liegen?

    Gruß KK

  • keithkeith
    antwortet
    Danke,
    funktioniert jetzt soweit.
    PHP-Code:
    <?php


    $fd 
    dio_open('/dev/ttyACM0',O_RDWR O_NOCTTY O_NONBLOCK);
    if (!
    $fd) {
        echo 
    'Fehler beim Öffnen der seriellen Schnittstelle';
        } else {
          
    dio_fcntl($fdF_SETFLO_SYNC);
          
    dio_tcsetattr($fd, array('baud' => 9600,
                                   
    'bits' => 8,
                                   
    'stop' => 1,
                                   
    'parity' => 0));
          
    $w dio_write($fd"LED12off");
          function 
    readNextValue($fd) {
                     
    $buffer '';
                    do {
                     
    $c dio_read($fd1);
                     if(
    $c == "Y") {
                        
    $buffer .= $c;
                        break;
                    }
                        
    $buffer .= $c;
                        
    usleep(10);
                     } while(
    true);
             return 
    $buffer;
                     }
    echo 
    "Temperatur: ";

    $r=readNextValue($fd);
    echo 
    $r;
        }
    dio_close($fd);
    ?>

    Gruß KK

    Einen Kommentar schreiben:


  • erc
    antwortet
    Zitat von keithkeith Beitrag anzeigen
    #8 der code nur mit einem "festen" string zum testen
    ($wert="teststring")
    #9 habe ich aus dem Arduino heraus per Schleife Werte einzeln übergeben (wollen).

    Gruß KK
    Du drückst F5?


    Zitat von keithkeith Beitrag anzeigen
    So siehts es jetzt genau aus,
    habs versucht einzubauen!
    PHP-Code:
    <?php
    $fd 
    dio_open('/dev/ttyACM0',
                       
    O_RDWR O_NOCTTY O_NONBLOCK);
    if (!
    $fd) {
          
    /* handle the failure to open the file */
          
    echo 'Fehler beim Öffnen der Seriellen Schnittstelle';
        } else {
          
    dio_fcntl($fdF_SETFLO_SYNC);
          
    dio_tcsetattr($fd, array('baud' => 9600,
                                   
    'bits' => 8,
                                   
    'stop' => 1,
                                   
    'parity' => 0));

          
    $w dio_write($fd"LED12on");

          
    readNextValue();
          function 
    readNextValue($fd) {
                     
    $buffer '';
             while(
    true) {
                     
    $c dio_read($fd1);
                     if(
    $c == "\n") break;
                     
    $buffer .= $c;
                     
    usleep(10);
                     echo 
    "$c:" $c;
                     echo 
    "$buffer:" $buffer;
                     }

             return 
    $buffer;
                     }


         
    // echo "Temperatur: " .$r. "<br>";
        
    }
    dio_close($fd);
    ?>
    Und was passiert?


    PHP-Code:
    <?php

    function readNextValue($fd) {
        
    $buffer '';
        while(
    true) {
            
    $c dio_read($fd1);
            if(
    $c == "\n") break;
            
            
    $buffer .= $c;
            
            echo 
    '$c:' $c;
                    echo 
    '$buffer:' $buffer;
            
            
    usleep(10);
        }
        
        return 
    $buffer;
    }


    $fd dio_open('/dev/ttyACM0'O_RDWR O_NOCTTY O_NONBLOCK);
    if (!
    $fd) {
          
    /* handle the failure to open the file */
          
    echo 'Fehler beim Öffnen der Seriellen Schnittstelle';
        } else {
          
    dio_fcntl($fdF_SETFLO_SYNC);
          
    dio_tcsetattr($fd, array('baud' => 9600,
                                   
    'bits' => 8,
                                   
    'stop' => 1,
                                   
    'parity' => 0));

          
    $w dio_write($fd"LED12on");

          
    var_dump(readNextValue());
        

         
    // echo "Temperatur: " .$r. "<br>";
        
    }
    dio_close($fd);
    ?>

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Zitat von keithkeith Beitrag anzeigen
    Was genau meinst Du denn mit Protokoll?
    An der Stelle waren wir schon vor ein paar Tagen:
    Das läuft darauf hinaus, ein Protokoll zu realisieren.

    Einen Kommentar schreiben:


  • keithkeith
    antwortet
    error_reporting(-1);
    sagt nichts (keine Fehler)
    Was genau meinst Du denn mit Protokoll?
    Ich verstehe leider fast nur Bahnhof
    Gruß KK

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Zitat von keithkeith Beitrag anzeigen
    Protokolle habe ich nicht,
    Ohne Protokoll wird das nix. Dein Protokoll kann dabei ganz einfach gestrickt sein, z.B. ein simples Textprotokoll. Dein Datenchaos deutet darauf hin, das dein Arduino ständig Daten raushaut und du da "irgenwas" rausfischst.

    Zitat von keithkeith Beitrag anzeigen
    Fehler werden nicht angezeigt.
    error_reporting aktiviert? Ich sehe da nichts.

    Dann:
    - Funktionsdeklarationen haben nichts in Programmstrukturen (if, else, while..) zu suchen, stell sie an den Anfang.
    - Bei 9600 Baud kommt da ca. alle Millisekunde ein Byte rein. Dein usleep (Angabe in Mikrosekunden) darf schon in dieser Grösse liegen.
    - Ein byteweises Einlesen macht nach meinen Erfahrungen nicht viel Sinn,
    der Test auf ein Endezeichen im String ist nicht viel aufwendiger
    - Ein zusätzlichens Timeout für die Schleife macht sich immer gut

    Einen Kommentar schreiben:


  • keithkeith
    antwortet
    So siehts es jetzt genau aus,
    habs versucht einzubauen!
    PHP-Code:
    <?php
    $fd 
    dio_open('/dev/ttyACM0',
                       
    O_RDWR O_NOCTTY O_NONBLOCK);
    if (!
    $fd) {
          
    /* handle the failure to open the file */
          
    echo 'Fehler beim Öffnen der Seriellen Schnittstelle';
        } else {
          
    dio_fcntl($fdF_SETFLO_SYNC);
          
    dio_tcsetattr($fd, array('baud' => 9600,
                                   
    'bits' => 8,
                                   
    'stop' => 1,
                                   
    'parity' => 0));

          
    $w dio_write($fd"LED12on");

          
    readNextValue();
          function 
    readNextValue($fd) {
                     
    $buffer '';
             while(
    true) {
                     
    $c dio_read($fd1);
                     if(
    $c == "\n") break;
                     
    $buffer .= $c;
                     
    usleep(10);
                     echo 
    "$c:" $c;
                     echo 
    "$buffer:" $buffer;
                     }

             return 
    $buffer;
                     }


         
    // echo "Temperatur: " .$r. "<br>";
        
    }
    dio_close($fd);
    ?>

    Einen Kommentar schreiben:


  • keithkeith
    antwortet
    #8 der code nur mit einem "festen" string zum testen
    ($wert="teststring")
    #9 habe ich aus dem Arduino heraus per Schleife Werte einzeln übergeben (wollen).

    Gruß KK

    Einen Kommentar schreiben:


  • erc
    antwortet
    Der Code in Beitrag #1 macht definitv nicht das was du in #8 und #9 beschreibst...

    Einen Kommentar schreiben:


  • keithkeith
    antwortet
    Hab ich dich, im ersten beitrag gepostet!

    Gruß KK

    Einen Kommentar schreiben:


  • erc
    antwortet
    Zeig doch mal dein PHP Script. Das die Daten gestückelt ankommen ist normal, das sie unvollständig ankommen ist nicht normal. Eine Serielleschnittstelle liefert ein Datenstrom, was du mit dem Datenstrom machst ist deine Sache. Wenn du schnell hintereinander den Empfangsbuffer ausliest (dio_read) ist es kein wunder das du immer nur ein paar Byte bekommst. Entweder wartest du einige Zeit, oder besser du denkst dir ein sinnvolles Format aus. Ein ganz simples Format wäre z.B. Zeilenumbruch markiert das Ende eines Wertes. Dann kannst du mit PHP so die Werte einlesen:

    PHP-Code:
    function readNextValue($fd) {
      
    $buffer '';
      while(
    true) {
           
    $c dio_read($fd1);
           if(
    $c == "\n") break;

           
    $buffer .= $c;
           
    usleep(10);
      }

      return 
    $buffer;

    Einen Kommentar schreiben:


  • keithkeith
    antwortet
    Hi,
    ich habe es aus dem Arduino heraus mit folgendem Stringmethoden versucht:
    Serial.println("testabc");
    Serial.print("testabc");
    Serial.write("testabc");

    Alle Methoden geben Werte ans Php ab, aber nie den gesamten String.
    Gruß KK

    Ich habe jetzt mal im Arduino Zeichen, für Zeichen gesendet, mit kleiner Pause:
    for (int i = 0; i < 6; i++){
    Serial.print(myStrings[i]);
    delay(500);
    }
    Jetzt kommt aber immer nur ein Buchstabe des Strings in meinem PHP an.
    Gruß KK

    Einen Kommentar schreiben:


  • keithkeith
    antwortet
    Hi und danke für dein Interesse an "meinem" Thema.
    Es geht "nur" darum ein vom Arduino gesendetes Datum, wie im ersten Beitrag beschrieben auszulesen.
    Das Ganze versuche ich mit DIO.
    DIO ist installiert.
    Reset ist hardwaremäßig ausgeschaltet.
    Es kommen Zeichen an, aber immer nur 3, oder 2, oder eines, in unterschiedlichster Anordnung
    Test mit "festem" String ("Teststring") ergibt folgende Rückgabe:
    Test
    st
    r
    Test
    r
    usw.

    Code wie im ersten Beitrag.

    Protokolle habe ich nicht, Fehler werden nicht angezeigt.

    Viele Grüße
    KK

    Einen Kommentar schreiben:


  • mermshaus
    antwortet
    sorry wenn ich zu wenig Informationen geliefert habe, was fehlt denn noch?
    Das ist halt schon ein ziemliches Spartenthema, würde ich sagen. Websuche nach "arduino dio_open" liefert zum Beispiel nur eine Handvoll Treffer. Deshalb wäre es hilfreich, wenn du „uns“/den Lesern ein wenig mehr Hintergrund geben würdest. Warum sollte das so funktionieren (Spezifikationen, Protokolle, …)? Woher hast du den Code? Warum nimmst du gerade DIO (das man wohl über PECL installieren müsste?) und nicht irgendwas anderes? Wie gehst du damit um, dass sich der Arduino standardmäßig bei jedem Verbindungsaufbau neustartet? So was in der Richtung.

    Dann könntest du zum Beispiel auch mal mitteilen, was du konkret dem Arduino schickst und was er dir konkret zurückschickt. Du hast einen Teil der entsprechenden Debug-Ausgaben dazu ja sogar im Code stehen.

    Einen Kommentar schreiben:


  • keithkeith
    antwortet
    Hi,
    das habe ich bereits getestet.
    ich kann auch keine bestimmte abfolge erkennen.
    mal schickt er 3, dann 2, dann1, dann 2....

    Gruß KK

    Einen Kommentar schreiben:

Lädt...
X