我在fedora 13中安装了xampp。我正在尝试使用php serial class通过串口与微控制器通信。 我的代码是example.php
include("php_serial.class.php");
$serial = new phpSerial();
$serial->deviceSet("0");
$serial->confBaudRate(9600); //Baud rate: 9600
$serial->confParity("none"); //Parity (this is the "N" in "8-N-1")
$serial->confCharacterLength(8); //Character length (this is the "8" in "8-N-1")
$serial->confStopBits(1); //Stop bits (this is the "1" in "8-N-1")
$serial->confFlowControl("none"); //Device does not support flow control of any kind, so set it to none.
//Now we "open" the serial port so we can write to it
$serial->deviceOpen();
$serial->sendMessage("*1" ); //sleep(1); // echo "hi"; $serial->deviceClose();
?>
php脚本被执行但会发出以下警告。
警告:指定的串口在第147行的/opt/lampp/htdocs/xampp/php_serial.class.php中无效 警告:无法设置波特率:设备未在第241行的/opt/lampp/htdocs/xampp/php_serial.class.php中设置或打开 警告:无法设置奇偶校验:设备未在第295行的/opt/lampp/htdocs/xampp/php_serial.class.php中设置或打开
...我使用了命令:chmod 0777 / dev / ttyUSB0来授予权限。我还尝试使用命令将apache用户“prudhvi”添加到拨出组: $ usermod -a -G dialout prudhvi
但它不起作用。当我使用命令直接从终端发送命令时:echo 1> / dev / ttyUSB0它工作,'1'传输到串口。但是使用php我得到了上述警告。
我使用“$ whoami”检查用户名,并将该用户“prudhvi”添加到拨出组。它仍然无法正常工作。请帮帮我们。
答案 0 :(得分:3)
我用Debian做过一次用PHP脚本来控制Arduino板,最初遇到了同样的问题。
在Debian中,您需要将Apache用户添加到拨出组,以允许它发出串行连接请求。我认为Fedora也是如此。
在Debian中,命令是:
useradd -G dialout www-data
但是我相信Fedora会将Apache用户命名为apache。我没有要测试的Fedora机器,但我认为你需要运行的命令是:
useradd -G dialout apache
然后您需要重新启动xampp服务器。
请参阅以下内容以供参考:
http://www.cyberciti.biz/faq/howto-linux-add-user-to-group/ http://fedoraproject.org/wiki/Administration_Guide_Draft/Apache#Apache_File_Security
尼尔
答案 1 :(得分:2)
你能否发布第147行“/opt/lampp/htdocs/xampp/php_serial.class.php”附近/相关的行?
我怀疑您正在尝试错误地设置设备(如Marc所示)。您正在同时进行的其他测试中已使用该端口或端口。我不确定您运行的脚本是否提供了特定于您尝试连接到正在使用的端口的错误。
答案 2 :(得分:0)
首先测试一个hello world类型的php脚本来测试你的基本安装。
然后验证Web服务器/ php引擎是否作为允许访问与串行端口对应的适用/ dev / ttyWHATEVER设备文件的组中的用户运行。如果默认情况下这是真的,那将是令人惊讶的 - 您可能必须将其添加到'拨出'或类似组。
为您的代码添加一些故障检查/报告。
答案 3 :(得分:0)
归功于Marc B的评论让我看了这个,他已经死了:http://www.phpclasses.org/browse/file/17926.html
function deviceSet ($device)
{
if ($this->_dState !== SERIAL_DEVICE_OPENED)
{
if ($this->_os === "linux")
{
if (preg_match("@^COM(\d+):?$@i", $device, $matches))
{
$device = "/dev/ttyS" . ($matches[1] - 1);
}
if ($this->_exec("stty -F " . $device) === 0)
{
$this->_device = $device;
$this->_dState = SERIAL_DEVICE_SET;
return true;
}
}
elseif ($this->_os === "windows")
{
if (preg_match("@^COM(\d+):?$@i", $device, $matches) and $this->_exec(exec("mode " . $device)) === 0)
{
$this->_windevice = "COM" . $matches[1];
$this->_device = "\\.\com" . $matches[1];
$this->_dState = SERIAL_DEVICE_SET;
return true;
}
}
trigger_error("Specified serial port is not valid", E_USER_WARNING);
return false;
}
else
{
trigger_error("You must close your device before to set an other one", E_USER_WARNING);
return false;
}
}
我认为调用$serial->deviceSet("/dev/ttyUSB0");
会解决问题,但您可能需要修改php_serial.class.php
的来源才能使用/dev/ttyUSB
代替/dev/ttyS
。