Question

Je travaille sur un mobile contrôlé par le Web et j'utilise un port série pour communiquer avec un Arduino.J'ai écrit du PHP qui utilise simplement fwrite() et écrit un ASCII 1 ou un ASCII 2 sur le port série.L'Arduino écoute ce port et fait des choses en fonction de ce qu'il entend.Je sais que mon PHP fonctionne, car chaque fois que je lui dis d'envoyer des éléments, l'Arduino les reçoit.Voici le code Arduino :

//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
    }
}

Cela devrait donc être assez simple.À l'heure actuelle, lorsque j'envoie un ASCII 1 ou un ASCII 2, la LED avec laquelle je teste (sur la broche 13) s'allume et reste allumée.Mais si j'envoie un autre ASCII 1 ou 2, il s'éteint puis se rallume.Le but est de l'activer uniquement si un ASCII 1 est la dernière chose envoyée et de rester allumé jusqu'à ce qu'un 2 soit la dernière chose envoyée.

Modifier:Voici mon 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>
Était-ce utile?

La solution

S'il est C alors vous avez Affectation au lieu de comparaison dans les deux essais, les deux sont donc true, de sorte que toutes les écritures sont faites à chaque fois. Compiler avec un haut niveau d'avertissement (comme -Wall -pedantic dans GCC). Essayez ceci:


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

A partir du code PHP que vous avez publié (je ne suis pas un expert ici), il semble que vous écrivez binaire 1 en tant que char, qui est non ASCII 49, mais ASCII 1 (SOH), même pour 2. Essayez de changer à '1' en code PHP (ou 1 dans le code C.)

Voici un lien vers un certain article sur Contrôle du port série avec PHP - Je googlé, aucune idée de sa qualité - mais ne ressemble pas il suffit de simplement écrire un entier dans « com1 » - qui est hors de mon domaine, alors bonne chance:)

Autres conseils

Comme Nikolai l'a mentionné, il semble que vous effectuiez une affectation (=) plutôt qu'une comparaison (==) dans vos instructions "if".

Une bonne habitude prise par certains programmeurs C est de placer les valeurs r sur le côté gauche des comparaisons, afin que le compilateur génère une erreur si vous utilisez accidentellement l'opérateur d'affectation au lieu de l'opérateur de comparaison :

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

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

Cela fonctionne, quels que soient les indicateurs du compilateur ou le niveau d'avertissement que vous utilisez, car l'attribution à une rvalue est illégale.

Je dois ajouter que ce « filet de sécurité » ne fonctionne pas si vous devez comparer deux valeurs.

Peut-être trop tard, mais je pense que votre problème est que serial.read () ne lit qu'un seul caractère à la fois. Si vous envoyez « 49 » à partir du PC, lorsque vous appelez usbnumber = serial.read () vous obtiendrez « 4 » la première boucle et « 9 » la deuxième boucle. Aucune de ces conditions pour satisfaire les rien ne se fait et usbnumber est remis à 0.

Pour résoudre, vous pouvez changer la condition serial.available être

if (Serial.available() == 2)

et faire quelque chose comme ce qui suit pour convertir en nombre:

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

Une autre option consiste à utiliser la bibliothèque TextFinder - J'ai écrit un bref tutoriel sur mon site http: //mechariusprojects.com/thunderbolt/?p=60

Mech

J'ai trouvé votre réponse à la recherche d'autres choses, de toute façon je viens de face (je suppose) le même problème que vous aviez.

Dans le cas où vous ne l'avez pas déjà résolu, je pense que les problèmes n'est pas votre code, mais le mécanisme de remise à zéro automatique sur la carte arduino. C'est:. Chaque fois qu'une nouvelle connexion est établie sur le port série, la carte est remise à zéro arduino, ce qui permet un nouveau firmware à charger quand il programmation via le port série

Pour vérifier cela, essayez de clignoter une LED dans votre fonction setup(), si elle clignote chaque fois que vous chargez la page, cela confirme ma thèse.

Jetez un coup d'oeil ici: http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

I résolu par collage de la résistance de 120 Ohms entre + 5V et RESET. Rappelez-vous de l'enlever à chaque fois que vous souhaitez télécharger un nouveau firmware sur votre carte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top