Arduino serial Lesen
Arbeite ich an einer web-gesteuerten rover und bin mit einem seriellen Anschluss für die Kommunikation mit einem Arduino. Ich schrieb einige PHP nur verwendet fwrite()
und schreibt ein ASCII-1 oder ein ASCII-2 an den seriellen port. Der Arduino lauscht auf diesem port und macht Sachen, die basieren auf, was es hört. Ich weiß, dass mein PHP funktioniert, denn immer wenn ich es sagen, zu Sachen schicken, die der Arduino hat es erhalten. 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
}
}
So sollte dies Recht geradlinig. Gerade jetzt, wenn ich entweder senden Sie eine ASCII-1 oder ASCII 2, die LED Teste ich mit (auf pin 13) leuchtet auf und bleibt an. Aber, wenn ich ein anderes ASCII-1 oder 2, es schaltet sich aus und dann wieder eingeschaltet hat. Das Ziel ist, um es einzuschalten nur wenn eine ASCII-1 war das Letzte, was gesendet wird und bleiben an, bis eine 2 war das Letzte, was gesendet wird.
Edit: 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>
InformationsquelleAutor blueintegral | 2009-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es C, dann haben Sie Zuordnung anstelle von Vergleich in beiden tests, so sind beide
true
, also schreibt alles getan werden, jedes mal. Kompilieren mit hoher Warnstufe (wie-Wall -pedantic
im GCC). Versuchen Sie dies:Vom PHP-code, den Sie geschrieben (ich bin kein Experte hier) sieht es, Sie schreiben binäre 1 als ein char, der nicht-ASCII-49, aber ASCII 1 (soh), das gleiche gilt für 2. Versuchen Sie es zu
'1'
im PHP-code (oder1
im C-code.)Hier ist ein link zu einigen Artikel auf Die Steuerung der Serielle Schnittstelle mit PHP - habe ich gegoogelt, keine Ahnung von Ihrer Qualität, aber nicht schaut, wie es genug ist, schreiben Sie einfach eine Ganzzahl in "com1" - das ist aus meiner domain, also viel Glück 🙂
Kann man melden/drucken irgendwie was werden Sie empfangen? Auch posten Sie Ihre PHP - code- das wird helfen, das problem einzugrenzen.
Wenn ich versuche, den seriellen monitor in der arduino-Umgebung, PHP beschwert sich darüber, dass der com-port nicht verfügbar ist, für es zu schreiben,
Immer noch nichts. Muss es sein, dass was auch immer Darstellung 1 PHP ist das senden ist nicht das gleiche wie das, was es im Vergleich zu den arduino. Wie kann ich feststellen welche PHP versenden?
Ich weiß nicht, PHP genug, aber versuchen, das speichern in eine variable und drucken Sie es auf die Seite nach der Bearbeitung senden.
InformationsquelleAutor Nikolai Fetissov
Als Nikolai erwähnt, es sieht aus wie Sie tun, Zuweisung (=) statt Vergleich (==) in Ihrem "wenn" - Aussagen.
Eine gute Gewohnheit, dass einige C-Programmierer erhalten Sie in zu setzen, rvalues auf der linken Seite des Vergleichs, so dass der compiler wird einen Fehler erzeugen, wenn Sie versehentlich verwenden Sie den Zuweisungsoperator statt Vergleichsoperator:
Dies funktioniert, unabhängig davon, welche compiler-flags oder die Warnung Ebene, die Sie verwenden, da die Zuordnung zu einem rvalue ist illegal.
Sollte ich hinzufügen, dass dieses "Sicherheitsnetz" nicht funktioniert wenn Sie brauchen, um vergleichen zweier lvalues.
Wie gesagt, es ist eine gute Gewohnheit, dass etwas die C Programmierer in 😛 C-Programmierer, die nie in die Gewohnheit (auch die guten). Es ist definitiv gewöhnungsbedürftig, bevor es fühlt sich nicht mehr "falsch".
InformationsquelleAutor Dan Moulding
Kann zu spät sein, aber ich glaube, dein problem ist, dass serial.read() liest nur ein Zeichen zu einem Zeitpunkt. Wenn Sie senden "49" auf dem PC, wenn Sie anrufen usbnumber = serial.read() erhalten Sie "4" in der ersten Schleife und "9" die zweite Schleife. Keiner von diesen die diese Bedingungen erfüllen, so ist nichts getan, und usbnumber wird auf 0 zurückgesetzt.
Zu beheben, können Sie entweder ändern serial.verfügbar-Zustand zu sein
tun, und dann etwas wie das folgende zu konvertieren in eine Zahl:
Andere option ist die Verwendung die TextFinder-library - die ich geschrieben habe, eine kurze Anleitung auf meiner website http://mechariusprojects.com/thunderbolt/?p=60
Mech
InformationsquelleAutor will-hart
Fand ich Ihre Antwort auf der Suche nach anderen Sachen, die sowieso nur ich konfrontiert (denke ich mal) das gleiche problem Sie hatte.
Falls Sie noch nicht bereits gelöst, ich denke das Problem ist nicht dein code, aber die auto-reset-Mechanismus auf dem arduino-board.
Das heißt: jedes mal eine neue Verbindung auf dem seriellen port das arduino board zurückgesetzt wird, und so eine neue firmware geladen werden, wenn die Programmierung über die serielle Schnittstelle.
Um dies zu überprüfen, versuchen Sie, das blinken einer LED in Ihren
setup()
Funktion, wenn es blinkt jedes mal, wenn Sie laden Sie die Seite, dies bestätigt meine these.Haben einen Blick hier: http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection
Ich gelöst, indem man das 120-Ohm-Widerstand zwischen +5V und RESET. Denken Sie nur daran, um es zu entfernen, jedes mal, die Sie hochladen möchten Sie eine neue firmware auf dein board.
InformationsquelleAutor redShadow