2013-10-11 8 views
5

BEARBEITEN: Ich habe einige Tests mit dem folgenden Skript (hier gefunden: PHP serial port data return from Arduino). Es scheint, dass selbst die Verwendung von fwrite to/dev/ttyUSB0 meinen neuen Befehl plus den letzten vom Gerät gesendeten Befehl ausgibt. Das lässt mich denken, dass der serielle Port möglicherweise nicht korrekt eingerichtet wurde (zB muss stty verwendet werden, um Einstellungen zu ändern, um den Puffer zu löschen) oder es gibt noch etwas anderes (mit php) um den Puffer bei/dev/zu löschen ttyUSB0 vor dem Senden eines neuen Befehls. Jede Hilfe wäre dankbar, danke.Wie schreibe ich auf serielle Schnittstelle mit PHP? Ein Problem mit der Pufferung

$fp =fopen("/dev/ttyUSB0", "w+"); 
if(!$fp) { 
     echo "Error";die(); 
} 
fwrite($fp, $_SERVER['argv'][1] . 0x00); 
echo fread($fp, 10) . "\n"; 
fclose($fp); 

Original Frage:

ich php-Serien bin mit mit einem Gerät über die serielle Schnittstelle zu kommunizieren. Das Gerät verfügt über eine Funktion, um alle Ein- und Ausgänge für den seriellen Anschluss auf einem Bildschirm anzuzeigen. Wenn ich das folgende Skript ausführe, kann ich auf dem Gerät sehen, dass das Skript jeden vom Gerät ausgegebenen Befehl nimmt und es zurück zum Gerät sendet. Ich glaube, das verursacht ein Problem, indem ich einfach "OK" zurück ans Gerät antworte, die Ausgabe nicht wiederhole und dann "OK" sage. Wenn Sie den gleichen Befehl wiederholen, scheint es zunächst zu verwirren und dann wird der Befehl 'OK' nicht übernommen. Ich kann das umgehen, indem ich alle 0,1 Sekunden in einer Schleife "OK" ausspreche, aber ich würde lieber die Ausgabe vom Gerät lesen und dann entsprechend darauf reagieren. Ich glaube nicht, dass irgendetwas in meinem Skript dazu führt, dass ich die Befehle wiederholen muss. Ist das ein Problem mit der PHP-Serienklasse, die jemand erlebt hat? Ich habe versucht, $ autoflush = false einzustellen; ohne Unterschied.

Mein Skript:

require_once('php_serial.class.php'); 

$serial = new phpSerial; 
$serial->deviceSet('/dev/ttyUSB0'); 
$serial->confBaudRate(9600); 
$serial->confParity("none"); 
$serial->confCharacterLength(8); 
$serial->confStopBits(1); 
$serial->confFlowControl("none"); 

$serial->deviceOpen(); 

while (true) { 
    $read = $serial->readPort(); 
    if ($read) { 
     echo date("r") . '  ' . $read; 
//  $serial->sendMessage("\r\nOK\r\n"); 
    } 
} 

$serial->deviceClose(); 

Beispiel Ausgabe auf dem Bildschirm des Geräts, bevor mein Skript ausgeführt wird:

Tx: AT 
Tx: AT&F 
Tx: ATE0 
Tx: AT+IPR=9600 
Tx: AT 
Tx: AT 
Tx: AT 
Tx: ATH0 
Tx: AT+CMGF=1 

Beispiel Ausgabe auf dem Bildschirm des Geräts während mein Skript ausgeführt wird:

Tx: AT 
Rx: AT 
Tx: AT&F 
Rx: AT&F 
Tx: ATE0 
Rx: ATE0 
Tx: AT+IPR=9600 
Rx: AT+IPR=9600 
Tx: AT 
Rx: AT 
Tx: AT 
Rx: AT 
Tx: AT 
Rx: AT 
Tx: ATH0 
Rx: ATH0 
Tx: AT+CMGF=1 
Rx: ^[AT+CMGF=1 

Antwort

0

Minicom installieren und vor dem Öffnen des Ports versuchen mit:

$sms="ttyUSB0"; 
exec("minicom -b 9600 -o -D /dev/" . $sms); 
Verwandte Themen