Frage

Ich arbeite an einem webgesteuerten Rover und verwende eine serielle Schnittstelle zur Kommunikation mit einem Arduino.Ich habe etwas PHP geschrieben, das einfach verwendet wird fwrite() und schreibt ein ASCII 1 oder ein ASCII 2 auf die serielle Schnittstelle.Der Arduino hört diesen Port ab und führt Dinge aus, die auf dem basieren, was er hört.Ich weiß, dass mein PHP funktioniert, denn wann immer ich ihm sage, dass es etwas senden soll, empfängt das Arduino es.Hier ist der Arduino-Code:

//This listens to the serial port (USB) and does stuff based on what it is hearing.

int motor1Pin = 13; //the first motor's port number
int motor2Pin = 12; //the second motor's port number
int usbnumber = 0; //this variable holds what we are currently reading from serial


void setup() { //call this once at the beginning
    pinMode(motor1Pin, OUTPUT);
    //Tell arduino that the motor pins are going to be outputs
    pinMode(motor2Pin, OUTPUT);
    Serial.begin(9600); //start up serial port
}

void loop() { //main loop
    if (Serial.available() > 0) { //if there is anything on the serial port, read it
        usbnumber = Serial.read(); //store it in the usbnumber variable
    }

    if (usbnumber > 0) { //if we read something
        if (usbnumber = 49){
          delay(1000);
          digitalWrite(motor1Pin, LOW);
          digitalWrite(motor2Pin, LOW); //if we read an ASCII 1, stop
        }

        if (usbnumber = 50){
              delay(1000);
              digitalWrite(motor1Pin, HIGH);
              digitalWrite(motor2Pin, HIGH); //if we read an ASCII 2, drive forward
        }

        usbnumber = 0; //reset
    }
}

Das sollte also ziemlich einfach sein.Wenn ich jetzt entweder ASCII 1 oder ASCII 2 sende, leuchtet die LED, mit der ich teste (an Pin 13), auf und bleibt an.Wenn ich jedoch ein weiteres ASCII 1 oder 2 sende, schaltet es sich aus und dann wieder ein.Das Ziel besteht darin, es nur dann einzuschalten, wenn als letztes eine ASCII-1 gesendet wurde, und so lange eingeschaltet zu bleiben, bis als letztes eine 2 gesendet wurde.

Bearbeiten:Hier ist mein PHP:

<?php
    $verz="0.0.2";
    $comPort = "com3"; /*change to correct com port */

    if (isset($_POST["rcmd"])) {
        $rcmd = $_POST["rcmd"];
        switch ($rcmd) {
            case Stop:
                $fp =fopen($comPort, "w");
                fwrite($fp, chr(1)); /* this is the number that it will write */
                fclose($fp);


                break;
            case Go:
                $fp =fopen($comPort, "w");
                fwrite($fp, chr(2)); /* this is the number that it will write */
                fclose($fp);
                break;
            default:
                die('???');
        }
    }
?>
<html>
    <head><title>Rover Control</title></head>
    <body>
        <center><h1>Rover Control</h1><b>Version <?php echo $verz; ?></b></center>

        <form method="post" action="<?php echo $PHP_SELF;?>">
            <table border="0">
                <tr>
                    <td></td>
                    <td>

                    </td>
                    <td></td>
                </tr>
                <tr>
                    <td>
                        <input type="submit" value="Stop" name="rcmd"><br/>
                    </td>
                    <td></td>
                    <td>
                        <input type="submit" value="Go" name="rcmd"><br />
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td><br><br><br><br><br>

                    </td>
                    <td></td>
                </tr>
            </table>
        </form>
    </body>
</html>
War es hilfreich?

Lösung

Wenn es C, dann haben Sie Zuordnung statt Vergleich in beiden Tests, so dass beide true sind, so dass alle Schreibvorgänge jedes Mal durchgeführt werden. Kompilieren mit hohem Warnstufe (wie -Wall -pedantic in GCC). Versuchen Sie folgendes:


int a = 0;
if ( a == 1 ) printf( "a is not one: %d\n", a );
if ( a = 1 ) printf( "a is one: %d\n", a );

Von PHP Code, den Sie geschrieben (ich bin kein Experte hier) sieht es aus, dass Sie binäre 1 als Zeichen schreiben, die nicht ASCII ist 49, aber ASCII 1 (SOH), gleiche gilt für 2. Versuchen Sie es zu ändern, um '1' in PHP-Code (oder 1 in C-Code).

Hier ist ein Link zu einem gewissen Artikel über Steuerung der seriellen Schnittstelle mit PHP - ich googeln, keine Ahnung von seiner Qualität - aber sehe nicht wie es ist genug, nur eine ganze Zahl in „com1“ schreiben - das ist aus meiner Domain, so viel Glück:)

Andere Tipps

Wie Nikolai erwähnte, sieht es so aus, als würden Sie in Ihren „if“-Anweisungen eher Zuweisungen (=) als Vergleiche (==) durchführen.

Eine gute Angewohnheit einiger C-Programmierer besteht darin, R-Werte auf der linken Seite von Vergleichen einzufügen, sodass der Compiler einen Fehler generiert, wenn Sie versehentlich den Zuweisungsoperator anstelle des Vergleichsoperators verwenden:

if (50 == usbnumber) {   // This is okay.
    ...
}

if (50 = usbnumber) {    // The compiler will generate an error here.
    ...
}

Dies funktioniert unabhängig davon, welche Compiler-Flags oder Warnstufe Sie verwenden, da die Zuweisung zu einem R-Wert illegal ist.

Ich sollte hinzufügen, dass dieses „Sicherheitsnetz“ nicht funktioniert, wenn Sie zwei L-Werte vergleichen müssen.

Auch zu spät sein, aber ich denke, Ihr Problem ist, dass serial.read () liest nur ein Zeichen zu einem Zeitpunkt. Wenn Sie „49“ aus dem PC senden, wenn Sie anrufen usbnumber = serial.read () würden Sie „4“ die erste Schleife und „9“ die zweite Schleife zu bekommen. Keiner von ihnen erfüllen die Bedingungen so nichts getan wird, und usbnumber wird auf 0 zurückgesetzt.

Um dies zu beheben, können Sie entweder ändern serial.available Zustand sein

if (Serial.available() == 2)

und dann so etwas wie die folgende in eine Zahl zu konvertieren:

usbnumber = Serial.read() * 10 + Serial.read();

Eine andere Möglichkeit ist es, die TextFinder Bibliothek verwenden - ich geschrieben habe eine kurze Anleitung auf meiner Website http: //mechariusprojects.com/thunderbolt/?p=60

Mech

fand ich Ihre Antwort für andere Sachen suchen, sowieso nur stand ich (glaube ich) das gleiche Problem, das Sie haben.

Falls Sie nicht bereits es gelöst, ich glaube, die Probleme nicht Ihr Code, aber der Auto-Reset-Mechanismus auf der Arduino-Board. Das heißt:. Jedesmal, wenn eine neue Verbindung an der seriellen Schnittstelle eingerichtet, die Arduino-Board wird zurückgesetzt, das eine neue Firmware zur geladen werden, wenn sie über die serielle Schnittstelle Programmierung

Um dies zu überprüfen, versuchen, eine LED in Ihrer setup() Funktion blinkt, wenn es jedes Mal blinkt Sie die Seite laden, dies bestätigt meine These.

Haben Sie einen Blick hier: http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

I durch Aufkleben der 120 Ohm-Widerstand zwischen + 5V und RESET gelöst. Denken Sie daran, entfernen es jedes Mal, wenn Sie eine neue Firmware auf dem Board hochladen möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top