Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux openwrt上的Php串行到Arduino_Php_Serial Port_Arduino_Openwrt - Fatal编程技术网

linux openwrt上的Php串行到Arduino

linux openwrt上的Php串行到Arduino,php,serial-port,arduino,openwrt,Php,Serial Port,Arduino,Openwrt,我正在尝试使用Arduino进行基于网页的串行通信,它连接到运行Openwrt的路由器,但只有当屏幕正在运行或通过putty远程连接时,它才起作用,出于某种原因,php到串行通信没有正确启动会话?我使用ser2net通过以下设置管理串行数据 1000:raw:0:/dev/ttyACM0:9600 我也尝试过stty,在这个论坛上提供了各种设置建议 更新1 还尝试了80:raw:0:/dev/ttyACM0:9600作为ser2net的设置,假设端口80是web/http端口 我的php代码是

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

1000:raw:0:/dev/ttyACM0:9600
我也尝试过stty,在这个论坛上提供了各种设置建议

更新1

还尝试了
80:raw:0:/dev/ttyACM0:9600
作为ser2net的设置,假设端口80是web/http端口

我的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代码来说,它似乎解决了一些问题

几点

  • 在php代码中添加sleep允许命令在串行连接导致的重置后到达arduino,但是如果我在打开led 2时打开led 1,则led 1将重置为off。这意味着一个更复杂的代码,记录一个选择数组并将整个更新的数组发送给arduino,我希望避免这种情况,一次只发送一个命令
  • 当屏幕或油灰处于激活状态时,arduino是否也没有重置问题?所以问题是screen和putty做了什么来保持stty和php serial没有的连接
  • 更新3

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

    遗留问题:

  • 我认为这段代码将arduino绑定到与路由器的会话?但是我不确定
  • 它似乎正在吞噬来自Arduino的返回值,停止我的php页面获取数据返回
  • 我的系统日志文件包含Arduino丢失的返回数据
  • 更新4

  • 当我需要让它工作时,我使用了一个电容器来停止arduino上串行通信的自动复位
  • 如前所述,screen和putty在与arduino通信时不会产生重置问题,我尝试了STTY的许多不同设置,但找不到解决方案,但我仍在尝试并渴望发现screen/putty是如何做到这一点的

  • 看起来您的PHP正试图直接连接到tty。其中ser2net可能已经连接到tty。一次只能将一个应用程序连接到tty。停止ser2net,或者您的PHP应该根据ser2net.conf连接到所需tty的tcp侦听器

    谢谢您的输入mpflaga,我禁用了ser2net,但没有改进。我只是不明白screen或putty做了什么来启动一个连接,而我并没有用php做这个连接到serial?不是php专家。听起来像是个植物问题。使用ser2net,从openwrt box的bash,您可以telnet或netcat到本地主机1000或80,无论您的ser2net正在监听什么,以验证tty是否工作。是的,从我的windows pc使用putty,我可以连接到端口1000并命令arduino,在本地使用屏幕,我也可以命令arduino,所有这些都工作正常。奇怪的是,当我登录到我的网站时,我只能从远程网络/位置控制arduino,如果连接已经从screen或putty hope激活,这是有意义的,它看起来就像putty和screen启动ttyacm0,而php不确定当您的php尝试访问tty时ser2net是否停止。