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:
uscitarequire_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