2013-10-11 13 views
5

EDIT: Ho eseguito alcuni test con il seguente script (trovato qui: PHP serial port data return from Arduino). Sembra che anche usando fwrite a/dev/ttyUSB0 emetta il mio nuovo comando più l'ultimo comando inviato dal dispositivo. Questo mi fa pensare che forse la porta seriale non è stata impostata correttamente (ad esempio potrebbe essere necessario usare stty per modificare le impostazioni per cancellare il buffer) o c'è qualcos'altro che devo fare (con php) per cancellare il buffer su/dev/ttyUSB0 prima di inviare un nuovo comando. Qualsiasi aiuto sarebbe apprezzato, grazie.Come scrivere sulla porta seriale usando PHP? Avere un problema con il buffering

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

domanda originale:

sto usando php-seriale per comunicare con un dispositivo via porta seriale. Il dispositivo ha una funzione per visualizzare tutti gli input e output sulla porta seriale su uno schermo. Quando eseguo il seguente script, posso vedere sul dispositivo che lo script sta prendendo ogni comando in uscita dal dispositivo e lo ripete sul dispositivo. Credo che questo stia causando un problema in quanto voglio solo rispondere "OK" al dispositivo, non ripetere l'output e poi dire "OK". Ripetere prima lo stesso comando sembra confonderlo e quindi non aderirà al comando 'OK'. Posso aggirarlo mandando "OK" ogni 0,1 secondi su un ciclo, ma preferisco leggere l'output dal dispositivo e poi rispondere di conseguenza. Non credo che ci sia qualcosa nel mio script che dice di ripetere i comandi. Si tratta di un problema con la classe php-serial che qualcuno ha mai sperimentato? Ho provato a impostare $ autoflush = false; senza alcuna differenza.

Il mio script:

uscita
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(); 

Esempio sullo schermo del dispositivo prima che il mio script viene eseguito:

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

uscita Esempio sullo schermo del dispositivo mentre il mio script è in esecuzione:

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 

risposta

0

installare minicom e provare prima di aprire la porta con:

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