Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP写入串行端口?缓冲有问题_Php_Serial Port_Buffer_Stty - Fatal编程技术网

如何使用PHP写入串行端口?缓冲有问题

如何使用PHP写入串行端口?缓冲有问题,php,serial-port,buffer,stty,Php,Serial Port,Buffer,Stty,编辑:我已经用以下脚本做了一些测试(在这里找到:)。似乎即使使用fwrite to/dev/ttyUSB0也会输出我的新命令和从设备发送的最后一个命令。这使我认为可能串行端口设置不正确(例如,可能需要使用stty更改设置以清除缓冲区),或者在发送新命令之前,我还需要(使用php)在/dev/ttyUSB0处清除缓冲区。任何帮助都将不胜感激,谢谢 $fp =fopen("/dev/ttyUSB0", "w+"); if( !$fp) { echo "Error";die(); }

编辑:我已经用以下脚本做了一些测试(在这里找到:)。似乎即使使用fwrite to/dev/ttyUSB0也会输出我的新命令和从设备发送的最后一个命令。这使我认为可能串行端口设置不正确(例如,可能需要使用stty更改设置以清除缓冲区),或者在发送新命令之前,我还需要(使用php)在/dev/ttyUSB0处清除缓冲区。任何帮助都将不胜感激,谢谢

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

我使用php串口通过串口与设备通信。该设备具有在屏幕上显示串行端口的所有输入和输出的功能。当我运行以下脚本时,我可以在设备上看到该脚本正在获取设备输出的每个命令,并将其重复到设备上。我相信这是造成问题的原因,因为我只想回答设备的“OK”,而不是重复输出,然后说“OK”。首先重复相同的命令似乎会混淆它,然后它将无法坚持“OK”命令。我可以通过在循环中每0.1秒输出一次“OK”来解决这个问题,但我更愿意读取设备的输出,然后相应地做出响应。我不相信在我的脚本中有任何东西告诉它重复这些命令。这是任何人都遇到过的php串行类的问题吗?我尝试设置$autoflush=false;没有区别

我的剧本:

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();
运行脚本前设备屏幕上的输出示例:

Tx: AT
Tx: AT&F
Tx: ATE0
Tx: AT+IPR=9600
Tx: AT
Tx: AT
Tx: AT
Tx: ATH0
Tx: AT+CMGF=1
脚本运行时设备屏幕上的输出示例:

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

安装minicom并在打开端口前尝试以下操作:

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