串行端口读取与PHP怪异

时间:2013-04-13 17:08:19

标签: php python serial-port raspberry-pi

我有一个用PHP编写的项目。我需要从串口读取数据。我希望能够以与项目其余部分相同的语言读取串口。

我找到了一个很多人似乎遇到问题的课程。 php_serial.class.php根据示例,这是我为测试编写的内容。使用RFID读卡器作为串行输入。

#!/usr/bin/php
<?php

// Include the class to read the serial line.
include ("php_serial.class.php");

// Let's start the class
$serial = new phpSerial;

$serial->deviceSet("/dev/ttyAMA0");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
// We can change the baud rate, parity, length, stop bits, flow control
#$serial->confFlowControl("none");

// Check if we can open the serial line.  Otherwise die.
if(!$serial->deviceOpen()) die("unable to open device");

stream_set_timeout($serial->_dHandle, 10);

$rfid_key = FALSE;

// Start the loop to keep checking the
while(!$rfid_key)
{
    $read = $serial->readPort();

    // Array to store eachvalue of the RFID tag
    $ascii_read  = array();

    for($i = 0; $i < strlen($read); $i++)
    {
        $ascii_read[] = ord($read[$i]);
        if(count($ascii_read) == 14 && $ascii_read[0] == 2 && $ascii_read[13] == 3)
        {
            $rfid_key = implode("", $ascii_read);
            break;
        }
    }

    // If the key is empty then sleep for 1 second.
    if(!$rfid_key)
    {
        sleep(1);
    }
}

print_r($rfid_key);
print "\n\n";

如果我运行脚本,它将等待输入,如果我在天线上闪烁RFID标签则会失败。

然后我决定看看它是不是php,所以我写了一个python脚本。

import serial
serialport = serial.Serial("/dev/ttyAMA0", 9600, timeout=0.5)
response = serialport.readlines(None)
print response

如果我将标签放在天线上并运行脚本然后拉开标签,我会在该时间跨度内获得所读标签的任意数量的实例。告诉我RFID阅读器与RaspberryPi配合使用。

现在这是非常奇怪的部分。如果我在执行python代码后返回并执行php代码,那么它可以工作。这让我相信它与Python中完成的串口的实例化有关,它在后续执行时会为PHP代码提供支持。然后我删除python代码以实例化串口并退出,并且正如预期的那样php代码可以工作。

所以,我的问题是。 WTF是python做的PHP代码不是吗?我不是串行总线的专家,我非常困惑。

1 个答案:

答案 0 :(得分:2)

好的,我找到了解决方案。问题不是php脚本,而是为/ dev / ttyAMA010

设置的选项

经过大量研究后,我发现运行命令/bin/stty -F /dev/ttyAMA010向我展示了串行线路的当前状态。在重新启动后运行它会将此作为输出。

speed 9600 baud; line = 0;
-brkint -imaxbel

然后运行python脚本以查看差异是什么。

speed 9600 baud; line = 0;
min = 0; time = 0;
-brkint -icrnl -imaxbel
-opost
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

然后我系统地包含了每个配置选项并刷新了我的页面直到它工作。最后我发现我需要2个选项才能让php串口脚本正常工作。

stty -F /dev/ttyAMA0 -isig
stty -F /dev/ttyAMA0 -icanon