与Arduino、PHP和;OpenWrt。缺陷

与Arduino、PHP和;OpenWrt。缺陷,php,serial-port,arduino,openwrt,Php,Serial Port,Arduino,Openwrt,我正在尝试创建一个PHP web界面,使用OpenWrt固件通过TP Link MR3420路由器上的USB接口控制Arduino Uno 奇怪的是,我的PHP脚本只有在运行与arduino通信的python脚本之后才能从arduino得到回复 我确信我的PHP脚本能够正常工作,因为它能够关闭arduino上的LED,但没有收到arduino的回复 以下是我的PHP代码: require("lib/php_serial.class.php"); $serial = new phpSerial;

我正在尝试创建一个PHP web界面,使用OpenWrt固件通过TP Link MR3420路由器上的USB接口控制Arduino Uno

奇怪的是,我的PHP脚本只有在运行与arduino通信的python脚本之后才能从arduino得到回复

我确信我的PHP脚本能够正常工作,因为它能够关闭arduino上的LED,但没有收到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->\u exec(“stty-F”$this->\u device.”(int)$rate,$out)

替换为:

$ret = $this->_exec("stty -F " . $this->_device . " raw speed " . (int) $rate, $out);

$ret=$this->\u exec(“stty-F”。$this->\u设备。“原始速度”。(int)$rate,$out)

Arduino有一个记录在案的问题。我的第一个猜测是,您正在使用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
#/usr/bin/perl
严格使用;
使用设备::串行端口;
我的$port=Device::SerialPort->new(“/dev/ttyUSB0”);
$port->databits(8);
$port->baudrate(9600);#平价(“无”);
$port->stopbits(1);
$port->dtr\u活动(0)//将此项切换为1可触发重置

找到了问题的真正根源

在phpSerial类中:

$ret = $this->_exec("stty -F " . $this->_device . " " . (int) $rate, $out);
替换为:

$ret = $this->_exec("stty -F " . $this->_device . " raw speed " . (int) $rate, $out);

在运行任何操作之前,我在rc.local文件中使用这一行设置端口

stty -F /dev/ttyUSB0 raw speed 38400 -echo -hupcl
另外两个标志非常有用: -echo关闭OpenWRT/USB习惯,即在输入端回显每个输出 -hupcl通过在每次传输后不发送hup来关闭自动重置问题


这里再次出现了YMMV-我正在发送和接收单字节而不是字符串或复杂数据

自动重置已在此处使用自定义固件禁用:但仍然没有来自ArduiResolved的回复!在每个路由器启动时运行“stty-F/dev/ttyACM0 raw speed 115200”解决了我的问题如果你解决了自己的问题,你应该将你的解决方案作为答案发布并接受它。