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

  • [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


  • #2
    Du liest nur 6 Bytes. Zwei 16-Bit Zahlen + ein Punkt könnten da etwa hinkommen (nur eine Annahme, ich kenn de i/O-Spec nicht!).

    Versuche einmal mehr Bytes zu lesen.
    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

    Kommentar


    • #3
      Das ist mal wieder so ein Thread, bei dem ich mich wirklich frage, ob es Absicht ist, in der Fragestellung auf möglichst viele Informationen zu verzichten, die man ohne weiteres geben könnte.

      „Ich habe da Code im Internet gefunden, der wohl irgendwas tun soll. Aber er tut nicht irgendwas. Wieso?“

      Kommentar


      • #4
        Hi,
        sorry wenn ich zu wenig Informationen geliefert habe, was fehlt denn noch?

        Ist es ausreichend die Bits('bits' => 8,) auf z. B. auf 48 zu erhöhen?
        (6 Bytes = 48 bits)
        *hab's mal getestet, hat keine Auswirkung*

        Gibt es eine Quelle in der dieses Thema in Bezug auf DIO beschrieben ist?

        Vielen dank
        Gruß KK

        Kommentar


        • #5
          Die serielle Schnittstelle ist langsam und du holst die Daten im nonblockingmode.
          Du kannst probieren, ein paar ms zu warten und dann nochmal zu lesen.
          PHP-Klassen auf github

          Kommentar


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

            Gruß KK

            Kommentar


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

              Kommentar


              • #8
                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

                Kommentar


                • #9
                  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

                  Kommentar


                  • #10
                    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;

                    Kommentar


                    • #11
                      Hab ich dich, im ersten beitrag gepostet!

                      Gruß KK

                      Kommentar


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

                        Kommentar


                        • #13
                          #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

                          Kommentar


                          • #14
                            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);
                            ?>

                            Kommentar


                            • #15
                              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
                              PHP-Klassen auf github

                              Kommentar

                              Lädt...
                              X