我有一个已经用 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 很困惑。