Linux openwrt上的Php Serial到Arduino

时间:2013-10-21 16:40:45

标签: php serial-port arduino openwrt

我正在尝试使用连接到运行Openwrt的路由器的Arduino进行基于网页的串行通信,它确实有效,但只有当任一屏幕正在运行或通过putty远程连接时,由于某种原因,php才能运行串口没有正确启动会话?我使用ser2net来管理序列,具有以下设置

1000:raw:0:/dev/ttyACM0:9600

我也试过stty,在这个论坛上建议了各种设置

更新1

假设端口80是web / http端口

还尝试80:raw:0:/dev/ttyACM0:9600作为ser2net的设置

我的PHP代码是

 if (isset($_GET['action'])) 
 {
     $serial = new phpSerial();
     $serial->deviceSet('/dev/ttyACM0');
     $serial->confBaudRate(9600);
     $serial->confParity('none');
     $serial->confCharacterLength(8);
     $serial->confStopBits(1);
     $serial->confFlowControl('none');
     $serial->deviceOpen();

     if ($_GET['action'] == "PIN_12_HIGH") 
     {
         $serial->sendMessage("A");
     }
     if ($_GET['action'] == "PIN_12_LOW") 
     {
         $serial->sendMessage("B");
     }
     if ($_GET['action'] == "PIN_11_HIGH") 
     {
         $serial->sendMessage("C");
     }
     if ($_GET['action'] == "PIN_11_LOW") 
     {
         $serial->sendMessage("D");
     }

     $serial->deviceClose();
 }

更新2

如果我将sleep(1);添加到我的PHP代码中,它似乎可以解决一些问题

几点

  1. 将睡眠添加到php代码允许命令在串行连接引起的复位后到达arduino,但是如果我打开led 1,当我转向led 2时,led 1被重置为关闭。所以这意味着一个更复杂的代码,记录一个选择数组并将整个更新的数组发送到arduino,我想避免这种情况,一次只发送1个命令。
  2. 当屏幕或腻子处于活动状态时,arduino没有此重置问题?所以问题是屏幕和腻子做了什么来保持连接活着,stty和php连接没有?
  3. 更新3

    找到这个有用的post后,我似乎发现了一个可能的解决方案,Arduino不需要重置黑客攻击。 将cat /dev/ttyACM0 &添加到Openwrt路由器的启动配置中可以与Arduino进行串行通信,而无需在每次数据传输时重置它。

    剩下的问题:

    1. 我认为这段代码与路由器的会话绑定arduino?但我不确定。
    2. 似乎正在吃Arduino的返回值阻止我的php页面获取数据返回?
    3. 我的系统日志文件包含Arduino缺少的返回数据?
    4. 更新4

      1. 由于我需要让它工作,我使用了一个电容器来停止arduino上串行通信的自动复位。
      2. 如上所述屏幕和putty在与arduino通信时不会创建此重置问题,我尝试了许多与STTY不同的设置但无法找到解决方案,但我仍在努力并且热衷于发现屏幕/腻子如何做到这一点。

1 个答案:

答案 0 :(得分:0)

看起来您的PHP正在尝试直接连接到tty。 ser2net可能已经连接到tty的地方。一次只能将一个应用程序连接到tty。要么停止ser2net,要么PHP应该根据你的ser2net.conf连接到所需tty的tcp监听器