8

我已经在 Fedora 13 中安装了 xampp。我正在尝试使用 php 串行类通过串行端口与微控制器通信。我的代码是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 中指定的串行端口无效警告:无法设置波特率:设备未在 /opt/lampp/htdocs 中设置或打开第 241 行的 /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”添加到拨出组。它仍然不起作用。请帮帮我。

4

4 回答 4

3

我用 Debian 做过一次,用 PHP 脚本控制 Arduino 板,最初遇到了同样的问题。

在 Debian 中,您需要将 Apache 用户添加到 dialout 组,以允许它发出串行连接请求。我认为 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

尼尔

于 2012-05-16T08:06:42.537 回答
2

您能否在“/opt/lampp/htdocs/xampp/php_serial.class.php on line 147”附近/相关的行发布?

我怀疑您试图错误地设置设备(如 Marc 所示)。您同时进行的其他测试或该端口已在使用中。我不确定您正在运行的脚本是否提供特定于您尝试附加到已在使用的端口的错误。

于 2012-05-03T16:18:37.900 回答
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.

于 2012-05-20T21:00:04.627 回答
0

首先测试一个 hello world 类型的 php 脚本来测试你的基本安装。

然后验证 Web 服务器 / php 引擎是否以用户身份运行,该用户在允许访问与串行端口对应的适用 /dev/ttyWHATEVER 设备文件的组中。如果默认情况下这是真的,那将是令人惊讶的 - 您可能必须将其添加到“拨出”或类似组中。

向您的代码添加一些故障检查/报告。

于 2012-04-29T21:37:35.947 回答