Pregunta

Estoy trabajando en un móvil controlado por web y estoy usando un puerto serie para comunicarme con un arduino.Escribí algo de PHP que solo usa fwrite() y escribe un ASCII 1 o un ASCII 2 en el puerto serie.El Arduino escucha ese puerto y hace cosas según lo que escucha.Sé que mi PHP está funcionando porque cada vez que le digo que envíe cosas, Arduino las recibe.Aquí está el código 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
    }
}

Entonces esto debería ser bastante sencillo.En este momento, cuando envío un ASCII 1 o un ASCII 2, el LED que estoy probando (en el pin 13) se enciende y permanece encendido.Pero, si envío otro ASCII 1 o 2, se apaga y luego se vuelve a encender.El objetivo es activarlo solo si lo último que se envió fue un ASCII 1 y permanecer encendido hasta que lo último que se envió fue un 2.

Editar:Aquí está mi 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>
¿Fue útil?

Solución

Si es C, entonces usted tiene asignación en lugar de Comparación en ambas pruebas, por lo tanto son true, por lo que todas las escrituras se realizan cada vez. Compilar con el nivel de alerta alta (como en -Wall -pedantic CCG). Prueba esto:


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 de código PHP informados (no soy un experto aquí) parece que está escribiendo un 1 binario como un char, que no es ASCII 49, pero ASCII 1 (SOH), lo mismo para 2. Intente cambiar a '1' en código PHP (o 1 en código C.)

Aquí hay un enlace a algún artículo sobre Control del puerto serie con PHP - Busqué en google, ni idea de su calidad -, pero no se ve como que es suficiente con sólo escribir un número entero en "COM1" - que está fuera de mi dominio, así que buena suerte:)

Otros consejos

Como mencionó Nikolai, parece que estás haciendo una asignación (=) en lugar de una comparación (==) en tus declaraciones "si".

Un buen hábito que adoptan algunos programadores de C es poner rvalues ​​en el lado izquierdo de las comparaciones, de modo que el compilador genere un error si accidentalmente usa el operador de asignación en lugar del operador de comparación:

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

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

Esto funciona, independientemente de qué indicadores del compilador o nivel de advertencia esté utilizando, ya que asignar un rvalue es ilegal.

Debo agregar que esta "red de seguridad" no funciona si es necesario comparar dos valores l.

Puede ser demasiado tarde, pero creo que su problema es que serial.read () sólo lee un carácter a la vez. Si envía "49" de la PC, cuando se llama usbnumber = serial.read () usted estaría consiguiendo "4" del primer bucle y el segundo bucle "9". Ninguno de estos cumplen las condiciones para que nada se hace y usbnumber se pone a 0.

Para solucionar, puede cambiar la condición de ser Serial.available

if (Serial.available() == 2)

y luego hacer algo como lo siguiente para convertir en un número:

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

Otra opción es utilizar la biblioteca TextFinder - He escrito un breve tutorial en mi página web http: //mechariusprojects.com/thunderbolt/?p=60

Mech

He encontrado su respuesta en busca de otras cosas, de todos modos yo sólo enfrenté (supongo) el mismo problema que tenía.

En caso de que no lo ha resuelto, creo que los problemas no es su código, pero el mecanismo de restablecimiento automático de la placa Arduino. Es decir:. Cada vez que una nueva conexión se establece en el puerto serie, la placa Arduino se pone a cero, esto permite un nuevo firmware para ser cargado en la programación de ella a través del puerto serie

Para comprobar esto, trate de parpadear un LED en su función setup(), si parpadea cada vez que se carga la página, esto confirma mi tesis.

Tener una mirada aquí: http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

I resuelto por pegar el 120 Ohm resistencia entre + 5V y RESET. Sólo recuerde para quitarlo cada vez que se desea cargar un nuevo firmware para su tablero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top