/ / PHP Roomba Serial Port Kommunikation - php, serieller-port, virtueller-serieller-port

PHP Roomba Serial Port Kommunikation - php, serieller-port, virtueller-serieller-port

Ich versuche mit einem iRobot Roomba über die serielle Schnittstelle zu kommunizieren PHP-Klasse entwickelt von Remy Sanchez. Ich bin sicher, dass es die Daten sendet, während das iRobot USB-Kabel die Daten empfängt und aufleuchtet, jedoch scheint der Roomba die Befehle nicht zu akzeptieren, wie sie in der Roomba Serial Command Interface (SCI) Spezifikationshandbuch. Gibt es einen möglichen Grund dafür? Verfälscht die Klasse die Daten in irgendeiner Weise oder benötigt der Roomba einen bestimmten Datentyp, der an ihn gesendet wird, den PHP nicht unterstützt?

Zusätzliche Informationen (Ich bin mir nicht sicher, ob dies relevant ist)

Mit RealTerm kann ich mit dem Roomba kommunizierendirekt mit der Send Numbers-Funktion (wenn ich versuche, anders zu kommunizieren, sendet es jeden Tastendruck). Mit PuTTY akzeptiert der Roomba meine Befehle nicht, obwohl ich lokale Echo + Zeilenbearbeitung erzwingen kann. Er empfängt die Befehle, tut aber nichts damit, obwohl die Baudrate richtig konfiguriert ist.

Code

require("php_serial.class.php");
$serial = new phpSerial();
$serial->deviceSet("COM1");

$serial->confBaudRate(115200); //Baud rate: 115200
$serial->confParity("none");  //Parity (this is the "N" in "8-N-1")
$serial->confCharacterLength(8); //Character length (this is the "8" in "8-N-1")
$serial->confStopBits(1);  //Stop bits (this is the "1" in "8-N-1")
$serial->confFlowControl("none"); //Device does not support flow control

$serial->deviceOpen();

$start = sprintf("%c",128);
$power = sprintf("%c",133);

$serial->sendMessage("$start");

$time_start = microtime(true);
// Sleep for a while
usleep(1000000);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Did nothing in $time seconds <br>";

$serial->sendMessage("$power");
$serial->deviceClose();

Antworten:

1 für die Antwort № 1

Das Ergebnis von - (pow (2, 8) - N) ist eine ganze Zahl. PHP speichert intern ganzzahlige Werte als lang signiert.

Benutzen pack()!


0 für die Antwort № 2

Stellen Sie sicher, dass CR und / oder LF nach allen Befehlen korrekt verwendet werden. Einige Programme senden automatisch 1, beide oder keine ....


0 für die Antwort № 3

Während du Putty benutzt, ist dein Betriebssystem Linux, richtig? Also könnte COM1 falsch liegen. Versuchen Sie etwas wie $serial->deviceSet("/dev/ttyAMA0"); Und stellen Sie sicher, dass sich Ihr Web-Benutzer (www-data?) In der Gruppe "dialout" befindet.

Aber zuerst funktioniert es von der Kommandozeile (Bash):

Korrekte Konfiguration der seriellen Schnittstelle: sudo stty 115200 -F /dev/ttyAMA0 cs8 cread clocal

Senden Sie einige Testdaten von bash (starten Sie den passiven Modus): sudo echo -n -e "x80" > /dev/ttyAMA0

Lass den Raum sauber machen: sudo echo -n -e "x87" > /dev/ttyAMA0