我正在尝试创建一个PHP Web界面,通过使用OpenWrt固件的TP-Link MR3420路由器上的USB接口控制Arduino Uno
奇怪的是我的PHP脚本在运行与arduino通信的python脚本后才能从arduino获得回复
我确信我的PHP脚本正在运行,因为它能够关闭arduino上的leds但是没有得到arduino的回复
这是我的PHP代码:
require("lib/php_serial.class.php");
$serial = new phpSerial;
$serial->deviceSet("/dev/ttyACM0");
$serial->confBaudRate(9600);
$serial->deviceOpen();
$serial->sendMessage($cmd);
sleep(1);
$read = $serial->readPort();
$serial->deviceClose();
这是我的arduino草图:
int numSerial;
if (Serial.available() > 0)
{
char inByte = Serial.read();
switch (inByte)
{
case 'l':
numSerial = numberFromSerial();
if (numSerial >= 0)
{
Serial.print("LED Mode: ");
switch (numSerial)
{
case 0:
ledMode = 0;
Serial.print("OFF");
break;
case 1:
ledMode = 1;
Serial.print("TEMP");
break;
case 2:
ledMode = 2;
Serial.print("KR");
break;
}
}
else
Serial.print(ledMode);
break;
case 't': //Data request
Serial.print(getTemp());
break;
}
}
这是我的python代码:
import serial
ser = serial.Serial("/dev/ttyACM0", 9600, timeout=3)
ser.open()
ser.write("t")
print ser.readline()
ser.close()
请帮忙。 感谢。
找到了问题的真正根源!
在phpSerial类中:
$ret = $this->_exec("stty -F " . $this->_device . " " . (int) $rate, $out);
替换为:
$ret = $this->_exec("stty -F " . $this->_device . " raw speed " . (int) $rate, $out);
答案 0 :(得分:3)
找到了问题的真正根源!
在phpSerial类中:
$ret = $this->_exec("stty -F " . $this->_device . " " . (int) $rate, $out);
替换为:
$ret = $this->_exec("stty -F " . $this->_device . " raw speed " . (int) $rate, $out);
答案 1 :(得分:0)
Arduino有一个记录Auto Reset on Serial Connection的问题。我的第一个猜测是你用PHP代码触发了这个(这就是灯关闭的原因,但你没有收到任何回复)。
尝试使用上面链接中的一个解决方法。
这是一个perl代码段,您可以使用它来查看是否实际上是在触发此问题。
#!/usr/bin/perl
use strict;
use Device::SerialPort;
my $port = Device::SerialPort->new("/dev/ttyUSB0");
$port->databits(8);
$port->baudrate(9600); # <-- match to arduino settings
$port->parity("none");
$port->stopbits(1);
$port->dtr_active(0); //toggle this to one to trigger reset
答案 2 :(得分:0)
我在rc.local文件中使用此行在运行任何内容之前设置端口。
stty -F /dev/ttyUSB0 raw speed 38400 -echo -hupcl
这两个额外的标志很有用: -echo关闭OpenWRT / USB习惯,回输输入上的每个输出 -hupcl通过在每次传输后不发送hup来关闭自动复位问题
再次YMMV - 我发送和接收单个字节而不是字符串或复杂数据