我有一个用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代码不是吗?我不是串行总线的专家,我非常困惑。
答案 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