如何使用PHP向串口写入数据?在缓冲方面遇到了问题。

7

编辑:我已经进行了一些测试,使用以下脚本(在此处找到:PHP串口数据返回自Arduino)。似乎即使使用fwrite到/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-serial通过串口与设备通信。该设备具有在屏幕上显示串口的所有输入和输出的功能。当我运行以下脚本时,我可以在设备上看到脚本正在接受设备发出的每个命令,并将其重复发送回设备。我认为这会导致问题,因为我只想回答“OK”给设备,而不是重复输出然后说“OK”。首先重复相同的命令似乎会使它感到困惑,然后它将不遵循“OK”命令。我可以通过在循环中每0.1秒输出“OK”来解决这个问题,但我更愿意读取设备的输出,然后根据需要进行响应。我不认为我的脚本中有任何东西告诉它要重复命令。是否有任何人经历过php-serial类的此问题?我尝试设置$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
1个回答

0

安装 minicom 并在打开端口之前尝试:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接