1

我有一个已经用 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 代码不是吗?我不是串行总线的专家,而且对 atm 很困惑。

4

1 回答 1

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
于 2013-04-14T21:33:54.440 回答